名前空間
変種
操作

std::strong_order

提供: cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ (C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
ヘッダ <compare> で定義
inline namespace /* unspecified */ {

    inline constexpr /* unspecified */ strong_order = /* unspecified */;

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

    requires /* see below */

constexpr std::strong_ordering strong_order(T&& t, U&& u) noexcept(/* 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_iec559true の場合は、 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_order(t, u) は ill-formed です。

目次

[編集] expression-equivalent

e と式 f が同じ効果を持ち、どちらも潜在的に例外を投げるかどちらも潜在的に例外を投げない (すなわち noexcept(e) == noexcept(f)) であり、どちらも定数部分式であるかどちらも定数部分式でない場合、 ef と 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_ftorstd::invocable<const strong_order_ftor&, Args...> を満たします。 そうでなければ、 strong_order_ftor の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] ノート

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

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

xy が同じビットパターンを持つ場合に限り (total_order_less(x, y) || total_order_less(y, x)) == false です。

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

[編集]

[編集] 関連項目

6種類の演算子をすべてサポートする代用可能な三方比較の結果の型
(クラス) [edit]
三方比較を行い、 std::weak_ordering 型の結果を生成します
(カスタマイゼーションポイントオブジェクト) [edit]
三方比較を行い、 std::strong_ordering 型の結果を生成します (operator<=> が利用できない場合でも)
(カスタマイゼーションポイントオブジェクト) [edit]