名前空間
変種
操作

std::compare_three_way

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

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
関数オブジェクト
関数の呼び出し
(C++17)(C++23)
恒等関数オブジェクト
(C++20)
透過的な演算子ラッパー
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

古いバインダとアダプタ
(C++17まで*)
(C++17まで*)
(C++17まで*)
(C++17まで*)  
(C++17まで*)
(C++17*まで)(C++17*まで)(C++17*まで)(C++17*まで)
(C++20まで*)
(C++20まで*)
(C++17*まで)(C++17*まで)
(C++17*まで)(C++17*まで)

(C++17まで*)
(C++17*まで)(C++17*まで)(C++17*まで)(C++17*まで)
(C++20まで*)
(C++20まで*)
 
ヘッダ <compare> で定義
ヘッダ <functional> で定義
struct compare_three_way;
(C++20以降)

比較を実行する関数オブジェクト。関数呼び出し演算子のパラメータ型と戻り値の型を推論します。

目次

[編集] ネストされた型

ネストされた型 定義
is_transparent unspecified

[編集] メンバ関数

operator()
両方の引数に対して3方向比較の結果を取得します。
(public member function)

std::compare_three_way::operator()

template< class T, class U >
constexpr auto operator()( T&& t, U&& u ) const;

std::forward<T>(t) <=> std::forward<U>(u)expr として

  • もし expr組み込みoperator<=> をポインタ比較のために呼び出す結果となった場合、tu複合ポインタ型P として
  • T から P への変換シーケンス、または U から P への変換シーケンスが 等価性を保持しない 場合、動作は未定義です。
  • それ以外の場合

このオーバーロードは、std::three_way_comparable_with<T, U> が満たされている場合にのみ、オーバーロード解決に参加します。

[編集]

#include <compare>
#include <iostream>
 
struct Rational
{
    int num;
    int den; // > 0
 
    // Although the comparison X <=> Y will work, a direct call
    // to std::compare_three_way{}(X, Y) requires the operator==
    // be defined, to satisfy the std::three_way_comparable_with.
    constexpr bool operator==(Rational const&) const = default;
};
 
constexpr std::weak_ordering operator<=>(Rational lhs, Rational rhs)
{
    return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
 
void print(std::weak_ordering value)
{
    value < 0 ? std::cout << "less\n" :
    value > 0 ? std::cout << "greater\n" :
                std::cout << "equal\n";
}
 
int main()
{
    Rational a{6, 5};
    Rational b{8, 7};
    print(a <=> b);
    print(std::compare_three_way{}(a, b));
}

出力

greater
greater

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3530 C++20 ポインタを比較する際の構文チェックが緩和されました。 意味的な要件のみが緩和されています。

[編集] 関連項目

x == y を実装する制約付き関数オブジェクト
(クラス) [編集]
x != y を実装する制約付き関数オブジェクト
(クラス) [編集]
x < y を実装する制約付き関数オブジェクト
(クラス) [編集]
x > y を実装する制約付き関数オブジェクト
(クラス) [編集]
x <= y を実装する制約付き関数オブジェクト
(クラス) [編集]
x >= y を実装する制約付き関数オブジェクト
(クラス) [編集]
English 日本語 中文(简体) 中文(繁體)