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