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