std::strong_order
ヘッダ <compare> で定義
|
||
inline namespace /* unspecified */ { inline constexpr /* unspecified */ strong_order = /* unspecified */; |
(C++20以上) | |
呼び出しのシグネチャ |
||
template< class T, class U > requires /* see below */ |
||
三方比較を用いて2つの値を比較し、 std::strong_ordering 型の結果を生成します。
t
および u
を式、 T
および U
をそれぞれ decltype((t)) および decltype((u)) とすると、 std::strong_order(t, u) は以下と expression-equivalent です。
- std::is_same_v<std::decay_t<T>, std::decay_t<U>> == true の場合、
- std::strong_ordering(strong_order(t, u)) が
std::strong_order
の宣言を含まない文脈で行われるオーバーロード解決を用いて well-formed な式であれば、その式。 - そうでなく、
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)) が well-formed であれば、その式。
- そうでなければ、 ill-formed です。 テンプレート実体化の直接の文脈に現れた場合は置換失敗になります。
- std::strong_ordering(strong_order(t, u)) が
- そうでなければ、 std::strong_order(t, u) は ill-formed です。
目次 |
[編集] expression-equivalent
式 e と式 f が同じ効果を持ち、どちらも潜在的に例外を投げるかどちらも潜在的に例外を投げない (すなわち noexcept(e) == noexcept(f)) であり、どちらも定数部分式であるかどちらも定数部分式でない場合、 e は f と expression-equivalent です。
[編集] カスタマイゼーションポイントオブジェクト
名前 std::strong_order
はカスタマイゼーションポイントオブジェクトを表します。 これは semiregular なリテラルクラス型 (以下 strong_order_ftor
(説明専用)) の const な関数オブジェクトです。 strong_order_ftor
のすべてのインスタンスは等しいです。 すなわち、 std::strong_order
は自由にコピーでき、そのコピーはお互いに交換可能です。
型の集合 Args...
が与えられたとき、 std::declval<Args>()... が上記の std::strong_order
の引数に対する要件を満たすならば、 strong_order_ftor
は std::invocable<const strong_order_ftor&, Args...> を満たします。 そうでなければ、 strong_order_ftor
の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] ノート
[編集] IEEE 浮動小数点型の厳密な全順序
x
および y
を同じ IEEE 浮動小数点型の値、 total_order_less(x, y)
を ISO/IEC/IEEE 60559 の totalOrder によって定義される厳密な全順序において x
が y
より前に来るかどうかを表すブーリアンの結果とします。
x
と y
が同じビットパターンを持つ場合に限り (total_order_less(x, y) || total_order_less(y, x)) == false です。
-
x
もy
も NaN でない場合、-
x < y
の場合は、 total_order_less(x, y) == true です。 -
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) です。
-
[編集] 例
This section is incomplete Reason: no example |
[編集] 関連項目
(C++20) |
6種類の演算子をすべてサポートする代用可能な三方比較の結果の型 (クラス) |
(C++20) |
三方比較を行い、 std::weak_ordering 型の結果を生成します (カスタマイゼーションポイントオブジェクト) |
三方比較を行い、 std::strong_ordering 型の結果を生成します (operator<=> が利用できない場合でも) (カスタマイゼーションポイントオブジェクト) |