Namespaces
Variants

Comparison operators

From ja.cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

引数を比較します。

翻訳内容: - "Equal to" → "等しい" - "Yes" → "可"(技術文書では「はい」より「可」がよく使用されます) - HTMLタグ、属性、タグ内のテキスト、C++コードはすべて保持 - C++専門用語(bool, const, operatorなど)は翻訳せず保持
演算子名 構文 オーバーロード 可能 プロトタイプ例 ( class T の場合)
クラス定義内 クラス定義外
等しい a == b 可 bool T :: operator == ( const U & b ) const ; bool operator == ( const T & a, const U & b ) ;
等しくない a != b 可 bool T :: operator ! = ( const U & b ) const ; bool operator ! = ( const T & a, const U & b ) ;
未満 a < b 可 bool T :: operator < ( const U & b ) const ; bool operator < ( const T & a, const U & b ) ;
より大きい a > b 可 bool T :: operator > ( const U & b ) const ; bool operator > ( const T & a, const U & b ) ;
以下または等しい a <= b 可 bool T :: operator <= ( const U & b ) const ; bool operator <= ( const T & a, const U & b ) ;
以上 a >= b 可 bool T :: operator >= ( const U & b ) const ; bool operator >= ( const T & a, const U & b ) ;
三方比較 (C++20) a <=> b 可 R T :: operator <=> ( const U & b ) const ; [1] R operator <=> ( const T & a, const U & b ) ; [1]
注記
  • 組み込み演算子が bool を返す場合、ほとんどの ユーザー定義オーバーロード も bool を返すため、ユーザー定義演算子を組み込み演算子と同じ方法で使用できる。しかし、ユーザー定義の演算子オーバーロードでは、あらゆる型を戻り値の型として使用できる( void を含む)。
  • U は T を含む任意の型をとることができる。
  1. ↑ 1.0 1.1 R は operator<=> の戻り値の型である( 後述参照 )

目次

双方向比較

双方向比較演算子式の形式は以下の通りです

関係演算子
lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
等価演算子
lhs == rhs (5)
lhs != rhs (6)
**注記:** - HTMLタグ、属性、タグ内の内容は翻訳していません - C++固有の用語(lhs, rhs, ==, !=)は翻訳していません - 元のフォーマットを保持しています - 数値の(5)、(6)はそのまま維持しています
1) lhs が rhs より小さい場合 true を返し、それ以外の場合 false を返します。
2) lhs が rhs より大きい場合は true を返し、それ以外の場合は false を返します。
3) true を返す、もし lhs が rhs 以下である場合。 false をそれ以外の場合に返す。
4) lhs が rhs 以上の場合 true を返し、それ以外の場合 false を返す。
5) true を返す、もし lhs が rhs と等しい場合。それ以外の場合は false を返す。
6) true を返す、もし lhs が rhs と等しくない場合。 false をそれ以外の場合に返す。

組み込み双方向比較演算子

組み込みの二項比較演算子では、 lvalue-to-rvalue conversions 、 array-to-pointer conversions (C++26まで) および function-to-pointer conversions が lhs と rhs に適用されます。

これらの変換を適用する前に、 lhs と rhs の両方が配列型である場合、比較は非推奨となります。

(C++20以降)
(C++26まで)

組み込みの関係演算子において、一方のオペランドがポインタの場合、 他方のオペランドに対して 配列からポインタへの変換 が行われます。

組み込みの等価演算子において、一方のオペランドがポインタまたは ヌルポインタ定数 の場合、他方のオペランドに対して配列からポインタへの変換が行われます。

(C++26以降)

組み込みの双方向比較演算子の場合、結果は bool のprvalueとなります。

組み込み算術比較

変換された両オペランドが算術型または列挙型(スコープ付きまたはスコープなし)を持つ場合、 通常の算術変換 が両オペランドに対して実行されます。変換後の値が比較されます:

#include <iostream>
int main()
{
    static_assert(sizeof(unsigned char) < sizeof(int),
                  "Cannot compare signed and smaller unsigned properly");
    int a = -1;
    int b = 1;
    unsigned int c = 1;
    unsigned char d = 1;
    std::cout << std::boolalpha
              << "Comparing two signed values:\n"
                 " -1 == 1 ? " << (a == b) << "\n"
                 " -1 <  1 ? " << (a <  b) << "\n"
                 " -1 >  1 ? " << (a >  b) << "\n"
                 "Comparing signed and unsigned:\n"
                 // may issue different-signedness warning:
                 " -1 == 1 ? " << (a == c) << "\n"
                 // may issue different-signedness warning:
                 " -1 <  1 ? " << (a <  c) << "\n"
                 // may issue different-signedness warning:
                 " -1 >  1 ? " << (a >  c) << "\n"
                 "Comparing signed and smaller unsigned:\n"
                 " -1 == 1 ? " << (a == d) << "\n"
                 " -1 <  1 ? " << (a <  d) << "\n"
                 " -1 >  1 ? " << (a >  d) << '\n';
}

出力:

Comparing two signed values:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false
Comparing signed and unsigned:
 -1 == 1 ? false
 -1 <  1 ? false
 -1 >  1 ? true
Comparing signed and smaller unsigned:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false

組み込みポインタ等価比較

等価演算子 == および != の変換されたオペランドは、 std::nullptr_t 型、 (C++11以降) ポインタ型、またはメンバへのポインタ型を持つこともできます。

組み込みポインタの等値比較には、等しい、等しくない、未指定の3つの結果があります。組み込みポインタの等値比較に対する等値演算子が生成する値を以下に示します:

pとqの比較結果
返される値
p == q p ! = q
等しい true false
等しくない false true
未規定 未規定の bool 値

変換後の lhs と rhs の少なくとも一方がポインタの場合、 ポインタ変換 、 関数ポインタ変換 (C++17以降) および 修飾変換 が両方の変換された被演算子に対して実行され、 複合ポインタ型 に変換されます。複合ポインタ型の2つのポインタは以下のように比較されます:

  • あるポインタが完全なオブジェクトの アドレス を表し、別のポインタが
  • 異なる完全な非配列オブジェクトの終端を超えるアドレスを表す場合、または
  • 異なる完全な配列オブジェクトの最後の要素を超えるアドレスを表す場合、
比較結果は未規定です。
  • それ以外の場合、両方のポインタがともに null の場合、同じ関数を指している場合、または両方が同じアドレスを表している場合(つまり、同じオブジェクトの終端を指している、または終端を過ぎている場合)、それらは等しいと比較されます。
  • それ以外の場合、ポインタは等しくないと比較されます。

変換後の lhs と rhs の少なくとも一方がメンバへのポインタである場合、 メンバポインタ変換 、 関数ポインタ変換 (C++17以降) および 修飾変換 が両方の変換された被演算子に対して実行され、それらを 複合ポインタ型 に変換します。複合ポインタ型の2つのメンバポインタは以下のように比較されます:

  • 2つのメンバへのポインタが両方ともヌルメンバポインタ値の場合、それらは等しいと比較される。
  • 2つのメンバへのポインタのうち片方のみがヌルメンバポインタ値の場合、それらは等しくないと比較される。
  • いずれかが 仮想メンバ関数 へのポインタである場合、結果は未規定である。
  • 一方がクラス C1 のメンバを参照し、他方が別のクラス C2 のメンバを参照する場合(互いが互いの基底クラスでない場合)、結果は未規定である。
  • 両方が同じ 共用体 の(異なる可能性のある)メンバを参照する場合、それらは等しいと比較される。
  • それ以外の場合、2つのメンバへのポインタは、関連するクラス型の仮想的なオブジェクトを用いた間接参照を行った場合に、同じ 最終派生オブジェクト の同じメンバ、または同じ部分オブジェクトを参照するならば等しいと比較され、それ以外の場合は等しくないと比較される。
struct P {};
struct Q : P { int x; };
struct R : P { int x; };
int P::*bx = (int(P::*)) &Q::x;
int P::*cx = (int(P::*)) &R::x;
bool b1 = (bx == cx); // 未規定
struct B
{
    int f();
};
struct L : B {};
struct R : B {};
struct D : L, R {};
int (B::*pb)() = &B::f;
int (L::*pl)() = pb;
int (R::*pr)() = pb;
int (D::*pdl)() = pl;
int (D::*pdr)() = pr;
bool x = (pdl == pdr); // false
bool y = (pb == pl);   // true

std::nullptr_t 型の2つのオペランド、または std::nullptr_t 型の1つのオペランドと他方のヌルポインタ定数は等しいと比較される。

(C++11以降)

組み込みポインタ関係比較

関係演算子 > 、 < 、 >= および <= の変換されたオペランドは、ポインタ型を持つこともできます。

等しくないポインタ p と q に対する組み込みポインタ関係比較には、3つの可能な結果があります: p が大きい、 q が大きい、および未規定。組み込みポインタ関係比較に対する関係演算子が生成する値を以下に示します:

pとqの比較結果 返される値
p > q p < q p >= q p <= q
等しい false false true true
p が大きい true false true false
q が大きい false true false true
未規定 未規定の bool 値

変換された lhs と rhs が両方ともポインタの場合、 ポインタ変換 、 関数ポインタ変換 (C++17以降) および 修飾変換 が両方の変換された被演算子に対して実行され、それらを 複合ポインタ型 に変換します。複合ポインタ型の2つのポインタは以下のように比較されます:

  • ポインタが等しいと比較される、または等価比較の結果が未指定の場合、関係比較の結果は同じカテゴリに分類されます。
  • それ以外の場合(ポインタが等しくないと比較される)、いずれかのポインタがオブジェクトへのポインタでない場合、結果は未指定です。
  • それ以外の場合(両方のポインタがオブジェクトを指している)、結果は以下のルールと整合性のある半順序に基づいて定義されます:
  • 配列の2つの異なる要素 high と low が与えられ、 high が low よりも大きい添字を持つ場合、一方のポインタが high (または high の部分オブジェクト)を指し、他方のポインタが low (または low の部分オブジェクト)を指すとき、前者は後者よりも大きいと比較されます。
  • 一方のポインタが配列の要素 elem (または elem の部分オブジェクト)を指し、他方のポインタが同じ配列の終端を超えている場合、終端を超えたポインタはもう一方のポインタよりも大きいと比較されます。
  • 一方のポインタが完全なオブジェクト、基底クラスの部分オブジェクト、またはメンバー部分オブジェクト obj (または obj の部分オブジェクト)を指し、他方のポインタが obj の終端を超えている場合、終端を超えたポインタはもう一方のポインタよりも大きいと比較されます。

(注:指定されたテキストブロック内に翻訳対象となる実際のテキストコンテンツが存在しないため、HTML構造のみを保持した状態で出力しています。「Member_layout」は識別子として翻訳対象外です)
  • ポインタが異なる non-zero-sized (since C++20) 非静的データメンバを指し、 同じ member access (until C++23) を持つ非共用体クラス型の同じオブジェクトのメンバ、またはそのようなメンバの部分オブジェクトを再帰的に指す場合、後に宣言されたメンバへのポインタは、もう一方のポインタよりも大きいと比較される。
  • それ以外の場合、結果は未規定である。

ポインタ全順序

各プログラムには implementation-defined strict total order over pointers が存在します。このstrict total orderは前述の半順序と整合しています:未規定の結果は実装定義となり、その他の結果は同じまま維持されます。

ポインタの厳密な全順序による比較は以下の場合に適用されます:

(C++14以降)
(C++20以降)

オーバーロード

ユーザー定義演算子に対するオーバーロード解決 において、列挙型を含むすべての昇格された算術型のペア L と R について、以下の関数シグネチャがオーバーロード解決に参加します:

bool operator < ( L, R ) ;
bool operator > ( L, R ) ;
bool operator <= ( L, R ) ;
bool operator >= ( L, R ) ;
bool operator == ( L, R ) ;
bool operator ! = ( L, R ) ;
【注記】 - HTMLタグ・属性は翻訳せず、元の書式を保持 - ``、`
`、``タグ内のテキストは翻訳対象外
- C++専門用語は翻訳せず保持
- 比較演算子の宣言構文は原文のまま維持

オブジェクトへのポインタまたは関数へのポインタであるすべての型 P について、以下の関数シグネチャがオーバーロード解決に参加します:

bool operator < ( P, P ) ;
bool operator > ( P, P ) ;
bool operator <= ( P, P ) ;
bool operator >= ( P, P ) ;
bool operator == ( P, P ) ;
bool operator ! = ( P, P ) ;
(注:指定された条件により、HTMLタグ・属性、タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しています。上記のテーブルには翻訳対象となる自然言語テキストが含まれていないため、翻訳作業は不要です。)

すべてのメンバオブジェクトへのポインタまたはメンバ関数へのポインタである型 MP に対して 、または std::nullptr_t (C++11以降) 、以下の関数シグネチャがオーバーロード解決に参加します:

bool operator == ( MP, MP ) ;
bool operator ! = ( MP, MP ) ;
#include <iostream>
struct Foo
{
    int n1;
    int n2;
};
union Union
{
    int n;
    double d;
};
int main()
{
    std::cout << std::boolalpha;
    char a[4] = "abc";
    char* p1 = &a[1];
    char* p2 = &a[2];
    std::cout << "Pointers to array elements:\n"
              << "p1 == p2? " << (p1 == p2) << '\n'
              << "p1 <  p2? " << (p1 <  p2) << '\n';
    Foo f;
    int* p3 = &f.n1;
    int* p4 = &f.n2;
    std::cout << "Pointers to members of a class:\n"
              << "p3 == p4? " << (p3 == p4) << '\n'
              << "p3 <  p4? " << (p3 <  p4) << '\n';
    Union u;
    int* p5 = &u.n;
    double* p6 = &u.d;
    std::cout << "Pointers to members of a union:\n"
              << "p5 == (void*)p6? " << (p5 == (void*)p6) << '\n'
              << "p5 <  (void*)p6? " << (p5 <  (void*)p6) << '\n';
}

出力:

Pointers to array elements:
p1 == p2? false
p1 <  p2? true
Pointers to members of a class:
p3 == p4? false
p3 <  p4? true
Pointers to members of a union:
p5 == (void*)p6? true
p5 <  (void*)p6? false

スリーウェイ比較

三方比較演算子の式は以下の形式を持ちます

a <=> b

この式は、以下のようなオブジェクトを返します。

  • ( a <=> b ) < 0 もし a < b の場合
  • ( a <=> b ) > 0 もし a > b の場合
  • ( a <=> b ) == 0 もし a と b が等しい/等価である場合

オペランドの一方が型 bool であり、他方がそうでない場合、プログラムは不適格となります。

両方のオペランドが算術型を持つ場合、または一方のオペランドが非スコープ列挙型を持ち、他方が整数型を持つ場合、通常の算術変換がオペランドに適用され、その後

  • 縮小変換が必要な場合(整数型から浮動小数点型への変換を除く)、プログラムは不適格です。
  • それ以外の場合、オペランドが整数型を持つ場合、この演算子は型 std::strong_ordering のprvalueを生成します:
  • std::strong_ordering::equal 両オペランドが算術的に等しい場合、
  • std::strong_ordering::less 最初のオペランドが算術的に2番目より小さい場合、
  • std::strong_ordering::greater それ以外の場合。
  • それ以外の場合、オペランドは浮動小数点型を持ち、演算子は型 std::partial_ordering のprvalueを生成します。式 a <=> b は以下を生成します
  • std::partial_ordering::less は a が b より小さい場合、
  • std::partial_ordering::greater は a が b より大きい場合、
  • std::partial_ordering::equivalent は a が b と等価である場合( - 0 <=> + 0 は等価)、
  • std::partial_ordering::unordered は順序付けされていない場合( NaN <=> anything は順序付けされていない)。

両方のオペランドが同じ列挙型 E を持つ場合、この演算子はオペランドをEの基底型に変換し、変換されたオペランドに <=> を適用した結果を生成します。

少なくとも一方のオペランドがオブジェクトへのポインタまたはメンバへのポインタである場合、 配列からポインタへの変換 、 ポインタ変換 および 修飾変換 が両オペランドに適用され、 複合ポインタ型 に変換されます。

変換されたポインタオペランド p と q に対して、 p <=> q は std::strong_ordering 型のprvalueを返します:

  • std::strong_ordering::equal が返されるのは、それらが 等しいと比較された場合 、
  • std::strong_ordering::less が返されるのは、 q が より大きいと比較された場合 p 、
  • std::strong_ordering::greater が返されるのは、 p が q より大きいと比較された場合、
  • 双方向比較の結果が未指定の場合、結果は未指定となる。

そうでない場合、プログラムは不適格となります。

オーバーロード

ユーザー定義演算子に対するオーバーロード解決 において、ポインタまたは列挙型 T の場合、以下の関数シグネチャがオーバーロード解決に参加します:

R operator <=> ( T, T ) ;
HTMLタグ、属性、コードブロック内のテキストは翻訳せず、元のフォーマットを保持しています。C++固有の用語(operator, <=>など)は翻訳していません。

ここで R は前述の順序付けカテゴリ型です。

#include <compare>
#include <iostream>
int main()
{
    double foo = -0.0;
    double bar = 0.0;
    auto res = foo <=> bar;
    if (res < 0)
        std::cout << "-0 is less than 0";
    else if (res > 0)
        std::cout << "-0 is greater than 0";
    else if (res == 0)
        std::cout << "-0 and 0 are equal";
    else
        std::cout << "-0 and 0 are unordered";
}

出力:

-0 and 0 are equal
(C++20以降)

注記

比較演算子は左から右へグループ化されるため、式 a < b < c は ( a < b ) < c と解析され、 a < ( b < c ) や ( a < b ) && ( b < c ) とはなりません。

#include <iostream>
int main()
{
    int a = 3, b = 2, c = 1;
    std::cout << std::boolalpha
        << (a < b < c) << '\n' // true; 警告が出る可能性あり
        << ((a < b) < c) << '\n' // true
        << (a < (b < c)) << '\n' // false
        << ((a < b) && (b < c)) << '\n'; // false
}

ユーザー定義の operator< に対する一般的な要件は strict weak ordering です。特に、これは Compare 型を扱う標準アルゴリズムとコンテナによって要求されます: std::sort 、 std::max_element 、 std::map など。

同じクラスの異なる非静的データメンバーへのポインターの 比較結果 は、非静的データメンバーが 3つの メンバーアクセスモード のそれぞれにおいて (C++23まで) 宣言順にメモリに配置されることを示唆します。

ランダムな起源のポインタ(例えば、すべてが同じ配列のメンバを指しているわけではない)を比較した結果は未規定ですが、多くの実装ではポインタの 厳密な全順序 を提供しています(例えば、連続した仮想アドレス空間内のアドレスとして実装されている場合)。そうでない実装(例えば、ポインタのすべてのビットがメモリアドレスの一部ではなく比較時に無視する必要がある場合、追加の計算が必要な場合、あるいはポインタと整数が1対1の関係にない場合)では、その保証を持つポインタ用の std::less の特殊化を提供しています。これにより、ランダムな起源のすべてのポインタを std::set や std::map のような標準の連想コンテナのキーとして使用することが可能になります。

EqualityComparable かつ LessThanComparable の要件を満たす型について、C++標準ライブラリは 等値性 (式 a == b の値)と 同値性 (式 ! ( a < b ) && ! ( b < a ) の値)を区別します。

ポインタとnullポインタ定数との比較は、 CWG issue 583 の解決により削除され、 N3624 に含まれました:

void f(char* p)
{
    if (p > 0) { /*...*/ } // N3624ではエラー、N3624以前はコンパイル可
    if (p > nullptr) { /*...*/ } // N3624ではエラー、N3624以前はコンパイル可
}
int main() {}

三方比較はクラス型に対して自動生成することができます、 デフォルト比較 を参照してください。

両方のオペランドが配列の場合、三方比較は不適格となります。

unsigned int i = 1;
auto r = -1 < i;    // 既存の落とし穴: 'false' を返す
auto r2 = -1 <=> i; // エラー: 縮小変換が必要
機能テスト マクロ 値 標準 機能
__cpp_impl_three_way_comparison 201907L (C++20) 三方比較 (コンパイラサポート)
__cpp_lib_three_way_comparison 201907L (C++20) 三方比較 (ライブラリサポート); ライブラリへの三方比較の追加

標準ライブラリ

比較演算子は標準ライブラリの多くのクラスでオーバーロードされています。

(C++20で削除)
オブジェクトが同じ型を参照しているかどうかをチェックする
( std::type_info のpublicメンバ関数)
(C++20で削除) (C++20で削除) (C++20)
二つの error_code を比較する
(関数)
(C++20で削除) (C++20で削除) (C++20)
error_conditionとerror_codeを比較する
(関数)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
pair内の値を辞書式順序で比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
タプル内の値を辞書式に比較する
(関数テンプレート)
(C++20で削除)
内容を比較
( std::bitset<N> の公開メンバ関数)
(C++20で削除)
2つのアロケータインスタンスを比較
( std::allocator<T> の公開メンバ関数)
他の unique_ptr または nullptr との比較
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
別の shared_ptr または nullptr と比較
(関数テンプレート)
(C++20で削除)
std::function と nullptr を比較する
(関数テンプレート)
(C++11) (C++11) (C++20で削除) (C++11) (C++11) (C++11) (C++11) (C++20)
2つの期間を比較する
(関数テンプレート)
(C++11) (C++11) (removed in C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
2つの時間点を比較する
(関数テンプレート)
(C++20で削除)
2つの scoped_allocator_adaptor オブジェクトを比較する
(関数テンプレート)
基となる std::type_index オブジェクトを比較する
( std::type_index の公開メンバ関数)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの文字列を辞書順で比較
(関数テンプレート)
(removed in C++20)
ロケールオブジェクト間の等価比較
( std::locale の公開メンバ関数)
(C++11) (C++11) (C++20で削除) (C++11) (C++20で削除) (C++11) (C++20で削除) (C++11) (C++20で削除) (C++11) (C++20で削除) (C++20)
2つの array の値を辞書順で比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの deque の値を辞書順で比較する
(関数テンプレート)
(C++11) (C++11) (removed in C++20) (C++11) (removed in C++20) (C++11) (removed in C++20) (C++11) (removed in C++20) (C++11) (removed in C++20) (C++20)
2つの forward_list の値を辞書順で比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの list の値を辞書順で比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの vector の値を辞書順に比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの map の値を辞書順で比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの multimap の値を辞書順で比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの set の値を辞書順で比較する
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの multiset の値を辞書順で比較する
(関数テンプレート)
(C++11) (C++11) (removed in C++20)
unordered_map内の値を比較する
(関数テンプレート)
(C++11) (C++11) (removed in C++20)
unordered_multimap内の値を比較する
(function template)
(C++11) (C++11) (removed in C++20)
unordered_set内の値を比較する
(関数テンプレート)
(C++11) (C++11) (removed in C++20)
unordered_multiset内の値を比較する
(関数テンプレート)
2つの queue の値を辞書順で比較する
(関数テンプレート)
2つの stack の値を辞書順で比較する
(関数テンプレート)
基底となるイテレータを比較する
(関数テンプレート)
(C++11) (C++11) (C++20で削除) (C++11) (C++11) (C++11) (C++11) (C++20)
基底となるイテレータを比較する
(関数テンプレート)
(C++20で削除)
2つの istream_iterator を比較する
(関数テンプレート)
(removed in C++20)
2つの istreambuf_iterator を比較する
(関数テンプレート)
(C++20で削除)
2つの複素数、または複素数とスカラーの比較
(関数テンプレート)
二つのvalarray、またはvalarrayと値を比較する
(関数テンプレート)
(C++11) (C++11) (removed in C++20)
二つの擬似乱数生成エンジンの内部状態を比較する
(関数)
(C++11) (C++11) (C++20で削除)
二つの分布オブジェクトを比較する
(関数)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
sub_matchを他のsub_match、文字列、または文字と比較する
(関数テンプレート)
(C++20で削除)
2つのマッチ結果の値を辞書順で比較する
(関数テンプレート)
(C++20で削除)
2つの regex_iterator を比較する
( std::regex_iterator<BidirIt,CharT,Traits> の公開メンバ関数)
(C++20で削除)
2つの regex_token_iterator を比較する
( std::regex_token_iterator<BidirIt,CharT,Traits> の公開メンバ関数)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
二つの thread::id オブジェクトを比較する
(関数)

名前空間 std::rel_ops は汎用的な演算子 ! = 、 > 、 <= 、および >= を提供します:

定義済みヘッダ <utility>
定義済み名前空間 std::rel_ops
ユーザー定義の operator == と operator < に基づいて比較演算子を自動生成
(関数テンプレート)

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 583
( N3624 )
C++98 6つの比較演算子すべてがポインタと
ヌルポインタ定数の比較に使用できた
等価演算子のみが
許可される
CWG 661 C++98 算術比較の実際の意味論(例えば
1 < 2 が true または false のどちらを返すか)が未規定だった
仕様が追加された
CWG 879 C++98 関数型へのポインタと
void へのポインタに組み込みの比較がなかった
これらのポインタに対する
比較仕様が追加された
CWG 1596 C++98 非配列オブジェクトはポインタ算術の目的でのみ
1要素の配列に属すると見なされていた
この規則は比較にも
適用される
CWG 1598 C++98 異なるクラス(互いに基底クラスではない)の
メンバへの2つのポインタは、指すメンバのオフセットが
同じであっても等しく比較されなかった
この場合の結果は
未規定
となる
CWG 1858 C++98 同じunionの異なるメンバを参照する2つの
メンバへのポインタが、同じメンバを参照する場合と
同じように等しく比較されるかどうかが明確でなかった
この場合、それらは
等しく比較される
CWG 2419 C++98 非配列オブジェクトへのポインタは、
ポインタが & によって取得された場合にのみ
サイズ1の配列の先頭要素へのポインタとして扱われた
すべての非配列オブジェクトへの
ポインタに適用される
CWG 2526 C++98 void および関数ポインタの関係比較( > 、 >= 、 < および <= )の
定義が N3624 によって削除されていた
復元された
CWG 2796 C++17 組み込みポインタ関係比較において、変換された
ポインタオペランドに対して関数ポインタ変換が
実行されなかった
この場合、これらの
変換を実行する

関連項目

**注記**: ご指定の要件に基づき、HTMLタグ、属性、C++専門用語(assignment, increment, decrement, arithmetic, logical, comparison, member access, other)は翻訳せず、元のフォーマットを保持しています。これらの用語はC++プログラミング言語における標準的な演算子カテゴリ名であり、技術文書では通常英語表記が維持されます。 翻訳の説明: - 「comma」を「カンマ」に翻訳 - HTMLタグ、属性はそのまま保持 - ``タグ内のC++コード「a, b」は翻訳せず保持 - すべての書式設定と構造を正確に維持 **翻訳の説明:** - 「conditional」を「条件演算子」と翻訳(C++の三項演算子の正式名称) - HTMLタグ、属性、スタイルは完全に保持 - ``内のコード(a ? b : c)は翻訳せずそのまま保持 - フォーマットと改行は元の構造を完全に維持
共通演算子
assignment increment
decrement
arithmetic logical comparison member
access
other

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

関数呼び出し

a ( ... )
カンマ

a, b
条件演算子

a ? b : c
特殊演算子

static_cast 関連する型間での変換を行う
dynamic_cast 継承階層内での変換を行う
const_cast cv 修飾子の追加または削除を行う
reinterpret_cast 無関係な型間での変換を行う
Cスタイルキャスト static_cast 、 const_cast 、 reinterpret_cast の混合により型変換を行う
new 動的ストレージ期間を持つオブジェクトを作成する
delete new式で作成されたオブジェクトを破棄し、取得したメモリ領域を解放する
sizeof 型のサイズを問い合わせる
sizeof... パラメータパック のサイズを問い合わせる (C++11以降)
typeid 型の型情報を問い合わせる
noexcept 式が例外をスローできるかどうかをチェックする (C++11以降)
alignof 型のアライメント要件を問い合わせる (C++11以降)

C documentation for Comparison operators
日本語訳:
C documentation の Comparison operators
変更点: - "for" → "の"(所有・関連を示す助詞) - HTMLタグ、属性、C++用語(Comparison operators)は翻訳せず保持 - 元のフォーマットを完全に維持