0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C++】初級者からみた三方比較演算子

Last updated at Posted at 2020-06-09

三方比較演算子について

C++20で追加予定の比較演算子<=>
比較演算子だがbool値を取らない。

主な用途

三方比較演算子をオーバーロードすることで他6種の比較演算子が自動生成される……わけではないらしく、
実際は==!=が生成されないため、==のオーバーロードも必要。
三方比較演算子をオーバーロードする際の戻り値の型は以下の三種。

  • std::strong_ordering
    ==が代入可能性を満たしている。
    ==が真なら値は全く同じという解釈で大体あっていると思う。

  • std::weak_ordering
    ==が代入可能性を満たしているとは限らない場合に使うっぽい。
    例えば文字列比較で大文字小文字を区別したくないときの三方比較演算子はこの型を返すべき。

  • std::partial_ordering
    唯一比較結果なし(unordered)の場合がある型
    unorderedのときはすべての比較演算が偽になる模様。

また三方比較演算子は符号なし整数型と符号付整数型の比較ができないらしいので制約でも使えそう。

以下コード例

#include <iostream>
// オーバーロードの例
struct A{
    int a = 0;
    auto operator<=>(const A& value) const -> std::strong_ordering{
        return this->a <=> value.a;
    }
};
// 制約に三方比較演算子を使用する
template <class T, class U>
requires requires (const T& x, const U& y) { x <=> y; }
bool myless(const T& t, const U& u){
    // return t < u; // t<u がdeleteされるとエラーになるので念の為こちらは使用しない
    return (t<=>u) < 0;
}
// 通常の比較演算子の場合
template <class T, class U>
requires requires (const T& x, const U& y) { x < y; }
bool myless2(const T& t, const U& u){
    return t<u;
}

int main()
{
    A a1{.a=-1},a2{.a=1};
    std::cout << std::boolalpha;
    std::cout << (a1 < a2) << std::endl;                // true
    std::cout << myless(a1,a2) << std::endl;            // true
    std::cout << (-1 < 1u) << std::endl;                // false
    //std::cout << myless(-1,1u) << std::endl;          // コンパイルエラー
    std::cout << myless2(-1,1u) << std::endl;           // false
}
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?