最終更新日時(UTC):
が更新

履歴 編集

function
<compare>

std::compare_three_way::operator()(C++20)

template<class T, class U>
  requires three_way_comparable_with<T, U> || BUILTIN-PTR-THREE-WAY(T, U)
constexpr auto operator()(T&& t, U&& u) const;

概要

ポインタ比較時のみ実装定義の狭義全順序による三方比較を行い、それ以外の場合は使用可能な<=>による三方比較を行う。

テンプレートパラメータ制約

少なくともどちらかを満たしていること。

  • three_way_comparable_with<T, U>
    • T, U<=>による比較を使用可能であり、戻り値型は比較カテゴリ型であること
  • declval<T>() <=> declval<U>()が組み込みのポインタ比較<=>演算子に解決されること
    • BUILTIN-PTR-THREE-WAY(T, U)はその場合にのみtrueを返す定数式

事前条件

std::forward<T>(t) <=> std::forward<U>(u)が組み込みのポインタ型Pに対する<=>演算子を呼び出す場合、T, UからPへの変換は等さを保持すること。

効果

  • std::forward<T>(t) <=> std::forward<U>(u)が組み込みのポインタ型Pに対する<=>演算子を呼び出す場合
  • それ以外の場合は以下と等価
    • return std::forward<T>(t) <=> std::forward<U>(u);

戻り値

ポインタ比較時はstd::strong_orderingの値、その他の場合はT, Uで使用可能な<=>の戻り値。ただし、比較カテゴリ型以外の型のオブジェクトが返されることはない。

備考

ポインタ比較時の順序付けは、ポインタ型Pに対する実装定義の狭義全順序の上で行われ、Pに対する組み込みの比較演算子が持つ半順序関係との一貫性がある。
すなわちこの関数オブジェクトによるポインタ値の比較では、組み込みの< <= > >= == !=演算子の結果が未規定の場合でも実装定義ではあるが大小もしくは等価性を判定でき、順序が規定されている範囲での順序関係は組み込みの演算子の結果と一致する。

例えば、同じ型の異なるオブジェクトに対するポインタ間やポインタとnullptrの間に何らかの順序を付ける事ができる。
ただし、そのような順序付けの結果がコンパイラや実行環境を超えて一致する保証はないので注意が必要である。

#include <iostream>
#include <compare>

int main() {
  int a{}, b{};

  int* pa = &a;
  int* pb = &b;

  std::compare_three_way comp{};

  std::cout << std::boolalpha;

  std::cout << (comp( a,  b) == 0) << std::endl;
  std::cout << (comp(pa, pb) == 0) << std::endl;
  std::cout << (comp(pa, pb) <  0) << std::endl;
  std::cout << (comp(pa, pb) >  0) << std::endl;
  std::cout << (comp(pa, nullptr) >  0) << std::endl;
}

出力例(GCC 10.0.0)

true
false
false
true
true

バージョン

言語

  • C++20

処理系

関連項目

参照