Comparison operators
引数を比較します。
| 演算子名 | 構文 | オーバーロード 可能 | プロトタイプ例 ( 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]
|
|
||||
目次 |
双方向比較
双方向比較演算子式の形式は以下の通りです
関係演算子
lhs
<
rhs
|
(1) | ||||||||
lhs
>
rhs
|
(2) | ||||||||
lhs
<=
rhs
|
(3) | ||||||||
lhs
>=
rhs
|
(4) | ||||||||
等価演算子
lhs
==
rhs
|
(5) | ||||||||
lhs
!=
rhs
|
(6) | ||||||||
タグ内の内容は翻訳していません
- C++固有の用語(lhs, rhs, ==, !=)は翻訳していません
- 元のフォーマットを保持しています
- 数値の(5)、(6)はそのまま維持しています
組み込み双方向比較演算子
組み込みの二項比較演算子では、 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は前述の半順序と整合しています:未規定の結果は実装定義となり、その他の結果は同じまま維持されます。
ポインタの厳密な全順序による比較は以下の場合に適用されます:
- operator ( ) を呼び出すこと std::less 、 std::greater 、 std::less_equal 、および std::greater_equal のポインタ型特殊化の。
|
(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
)
;
|
||
`、`
`、`
オブジェクトへのポインタまたは関数へのポインタであるすべての型
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
)
;
|
||
タグ内のテキスト、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
スリーウェイ比較三方比較演算子の式は以下の形式を持ちます
この式は、以下のようなオブジェクトを返します。
オペランドの一方が型 bool であり、他方がそうでない場合、プログラムは不適格となります。 両方のオペランドが算術型を持つ場合、または一方のオペランドが非スコープ列挙型を持ち、他方が整数型を持つ場合、通常の算術変換がオペランドに適用され、その後
両方のオペランドが同じ列挙型
少なくとも一方のオペランドがオブジェクトへのポインタまたはメンバへのポインタである場合、 配列からポインタへの変換 、 ポインタ変換 および 修飾変換 が両オペランドに適用され、 複合ポインタ型 に変換されます。 変換されたポインタオペランド p と q に対して、 p <=> q は std::strong_ordering 型のprvalueを返します:
そうでない場合、プログラムは不適格となります。
オーバーロード
ユーザー定義演算子に対するオーバーロード解決
において、ポインタまたは列挙型
ここで
このコードを実行
#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>
の公開メンバ関数)
|
|
(C++20で削除)
(C++20)
|
他の
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
オブジェクトを比較する
(関数テンプレート) |
|
(C++20で削除)
(C++20)
|
基となる
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
|
|
|
(C++20で非推奨)
|
ユーザー定義の
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 |
組み込みポインタ関係比較において、変換された
ポインタオペランドに対して関数ポインタ変換が 実行されなかった |
この場合、これらの
変換を実行する |
関連項目
- 演算子の優先順位
- 演算子のオーバーロード
- Compare (名前付き要件)
| 共通演算子 | ||||||
|---|---|---|---|---|---|---|
| assignment |
increment
decrement |
arithmetic | logical | comparison |
member
access |
other |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
関数呼び出し
a ( ... ) |
|
カンマ
a, b |
||||||
|
条件演算子
a ? b : c |
||||||
| 特殊演算子 | ||||||
|
static_cast
関連する型間での変換を行う
|
||||||
|
C documentation
for
Comparison operators
|
|
C documentation
の
Comparison operators
|