名前空間
変種
操作

std::strong_order

From cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
strong_order
(C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
ヘッダ <compare> で定義
inline namespace /* 未指定 */ {

    inline constexpr /* 不明 */ strong_order = /* 不明 */;

}
(C++20以降)
呼び出しシグネチャ
template< class T, class U >

    requires /* 以下を参照 */

constexpr std::strong_ordering strong_order( T&& t, U&& u ) noexcept(/* 以下参照 */);

2つの値を3方向比較を使用して比較し、std::strong_ordering 型の結果を生成します。

tu が式であり、TU がそれぞれ 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_iec559true の場合、浮動小数点値の 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 は以下をモデル化します。

それ以外の場合、__strong_order_fn の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] IEEE 浮動小数点型の厳密な全順序

xy が同じ IEEE 浮動小数点型の値であり、total_order_less(x, y) が ISO/IEC/IEEE 60559 で定義された totalOrder による厳密な全順序において xy より前に来るかどうかを示すブール結果であるとします。

(total_order_less(x, y) || total_order_less(y, x)) == false は、xy が同じビットパターンを持つ場合にのみ成り立ちます。

  • xy のどちらも 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;
    • xy の両方が同じ符号を持つ NaN で、x の仮数フィールドが y の仮数フィールドより小さい場合、total_order_less(x, y) == !std::signbit(x)

[編集]

[編集] 関連項目

6つすべての演算子をサポートし、置換可能である三方比較の結果型
(クラス) [編集]
三方比較を行い、std::weak_ordering 型の結果を生成する
(カスタマイゼーションポイントオブジェクト)[編集]
三方比較を行い、std::partial_ordering 型の結果を生成する
(カスタマイゼーションポイントオブジェクト)[編集]
operator<=> が利用できなくても、三方比較を行い std::strong_ordering 型の結果を生成する
(カスタマイゼーションポイントオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)