std::weak_order
| ヘッダ <compare> で定義
|
||
inline namespace /* unspecified */ { inline constexpr /* unspecified */ weak_order = /* unspecified */; } |
(C++20以上) | |
| 呼び出しのシグネチャ |
||
template< class T, class U > requires /* see below */ constexpr std::weak_ordering weak_order(T&& t, U&& u) noexcept(/* 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_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<=> が利用できない場合でも) (カスタマイゼーションポイントオブジェクト) |