構文が崩れる状況があり得るかどうか
if (first == second) // ...
それとは違うの?
if (first.operator==(second)) // ...
私はそうは思いませんが、それを知りたいだけです。
構文が崩れる状況があり得るかどうか
if (first == second) // ...
それとは違うの?
if (first.operator==(second)) // ...
私はそうは思いませんが、それを知りたいだけです。
a == b
は時々同等です
a.operator==(b)
と同等の場合もある
operator==(a,b)
==
意味が最終的に非クラス型の「組み込み」の意味になる場合は、どちらにも相当しない場合があります。
コンパイラが を検出するたびに、==
少なくとも 1 つの型にユーザー定義型が含まれている場合、メンバー演算子 (a
のクラス型のスコープに隠されている必要はありません) と非メンバー演算子 (引数依存のルックアップを使用) を検索し、組み込みの意味で(クラスには、組み込みの比較による通常の型への暗黙的な変換がある可能性があるため)。複数の意味がある場合は、オーバーロード解決のルールに進みます。
「2 つの構文が等しくない場合」という意味であれば、その答えは、等価演算子がどのような型のメンバーでもない場合first
です。明らかに、2 番目のバリアントは member のない型では機能しませんoperator==
。これには、組み込み型が含まれます。
の型のメンバー演算子が存在する場合first
、非メンバー演算子はfirst
との両方の型変換を許可する可能性があるため、この 2 つは異なりますがsecond
、メンバー演算子の例では の変換のみを許可できsecond
ます。
2 つのステートメントが異なる効果を持つ状況の 1 つの例は、 の暗黙的な変換がある場合ですfirst
。例えば:
struct my_int
{
int num;
my_int(int num) : num(num) {}
};
bool operator==(const my_int& a, const my_int& b)
{
return a.num == b.num;
}
この場合、有効な C++ コードは次のとおりです。
my_int a(1);
int x = 1;
if (x == a) {
std::cout << "Equal\n";
}
このコードをコンパイルする場所:
my_int a(1);
int x = 1;
if (x.operator==(a)) {
std::cout << "Equal\n";
}
次のようなコンパイル エラーが発生します。
conversion.cpp: 関数 'int main()' 内: conversion.cpp:21:16: エラー: メンバー 'operator==' の要求が 'x' にあり、クラス タイプではない 'int' です</p>
2番目はプリミティブでは機能しません。ただし、どちらの形式も、その演算子がパブリックにオーバーロードされているカスタムビルドタイプで機能します。
質問が構文のみに基づいている場合は、パラメーターのタイプによって異なります。次のコードを検討してください。
#include <iostream>
using namespace std;
class a {
public:
a(){
}
int operator ==(const a& v){
cout << "member operator" << endl;
return false;
}
};
int operator ==(a &v1, a &v2){
cout << "external operator" << endl;
return true;
}
int main(){
a a1, a2;
if (a1 == a2 && a1.operator==((const a&)a2)) {
cout << "done" << endl;
}
}
この設定では、両方のオペレーターが呼び出されます。関数型パラメータが同じであれば、メソッドが優先されるようです。