std::weak_order
| ヘッダ <compare> で定義 |
||
| inline namespace /* 未指定 */ { inline constexpr /* 不明 */ weak_order = /* 不明 */; |
(C++20以降) | |
| 呼び出しシグネチャ |
||
| template< class T, class U > requires /* 以下を参照 */ |
||
2つの値を3方向比較を用いて比較し、std::weak_ordering 型の結果を生成します。
t と u が式であり、T と U がそれぞれ decltype((t)) および decltype((u)) を表す場合、std::weak_order(t, u) は、次のように式相当(expression-equivalent)となります。
- もしstd::is_same_v<std::decay_t<T>, std::decay_t<U>>がtrueの場合
- std::weak_ordering(weak_order(t, u))。ただし、これは
std::weak_orderの宣言を含まないコンテキストでオーバーロード解決が行われた場合、well-formed な式である場合。 - そうでなく、
Tが浮動小数点型の場合- もし std::numeric_limits<T>::is_iec559 が true であれば、浮動小数点値の弱順序比較(以下参照)を実行し、その結果を
std::weak_ordering型の値として返します。 - そうでなければ、
Tの比較演算子によって観測される順序と一貫性のあるstd::weak_ordering型の値を生成します。
- もし std::numeric_limits<T>::is_iec559 が true であれば、浮動小数点値の弱順序比較(以下参照)を実行し、その結果を
- そうでなければ、std::weak_ordering(std::compare_three_way()(t, u))。ただし、これは well-formed な場合。
- そうでなければ、std::weak_ordering(std::strong_order(t, u))。ただし、これは well-formed な場合。
- std::weak_ordering(weak_order(t, u))。ただし、これは
- その他のすべての場合、式は不正形式であり、テンプレートインスタンス化の直接コンテキストに現れる場合、置換失敗を引き起こす可能性があります。
目次 |
カスタマイゼーションポイントオブジェクト
std::weak_order という名前は、*カスタマイズポイントオブジェクト* を表します。これは、リテラルな semiregular クラス型の const 関数オブジェクトです。説明のために、その型の cv 修飾されていないバージョンを __weak_order_fn と表記します。
__weak_order_fn のすべてのインスタンスは等価です。異なる __weak_order_fn 型のインスタンスを同じ引数で呼び出す効果は、インスタンスを表す式が左辺値か右辺値か、また const 修飾されているか否かにかかわらず同等です(ただし、volatile 修飾されたインスタンスは呼び出し可能であることが要求されません)。したがって、std::weak_order は自由にコピーでき、そのコピーは相互に交換可能に使用できます。
Args... という型のセットが与えられた場合、std::declval<Args>()... が上記の std::weak_order の引数に対する要件を満たす場合、__weak_order_fn は以下をモデル化します。
- std::invocable<__weak_order_fn, Args...>,
- std::invocable<const __weak_order_fn, Args...>,
- std::invocable<__weak_order_fn&, Args...>、および
- std::invocable<const __weak_order_fn&, Args...>.
それ以外の場合、__weak_order_fn の関数呼び出し演算子のいずれもオーバーロード解決に参加しません。
[編集] IEEE 浮動小数点型の厳密弱順序
x と y が同じ IEEE 浮動小数点型の値であり、weak_order_less(x, y) が C++ 標準によって定義された厳密弱順序において x が y に先行するかどうかを示すブール値であるとします。
- Neither x nor y is NaN の場合、weak_order_less(x, y) == true は x < y であるとき、かつそのときに限り真です。つまり、等価な浮動小数点値のすべての表現は等価です。
- x が負の NaN であり、y が負の NaN でない場合、weak_order_less(x, y) == true です。
- x が正の NaN でなく、y が正の NaN である場合、weak_order_less(x, y) == true です。
- Both x and y are NaNs with the same sign の場合、(weak_order_less(x, y) || weak_order_less(y, x)) == false です。つまり、同じ符号を持つすべての NaN は等価です。
[編集] 例
| このセクションは未完成です 理由: 例がありません |
[編集] 関連項目
| (C++20) |
6つすべての演算子をサポートし、置換可能ではない三方比較の結果型 (クラス) |
| (C++20) |
三方比較を行い、std::strong_ordering 型の結果を生成する(カスタマイゼーションポイントオブジェクト) |
| (C++20) |
三方比較を行い、std::partial_ordering 型の結果を生成する(カスタマイゼーションポイントオブジェクト) |
| (C++20) |
operator<=> が利用できなくても、三方比較を行い std::weak_ordering 型の結果を生成する(カスタマイゼーションポイントオブジェクト) |