8

是否会出现语法错误的情况

if (first == second) // ...

有什么不同?

if (first.operator==(second)) // ...

我不这么认为,只是想知道。

4

5 回答 5

9
a == b

有时相当于

a.operator==(b)

有时相当于

operator==(a,b)

==如果含义最终是非类类型的“内置”含义,有时不等于两者。

每当编译器看到==时,如果至少一种类型涉及用户定义的类型,它就会搜索成员运算符(不得隐藏在a的类类型范围内)和非成员运算符(使用参数相关查找)并内置在含义上(因为一个类可能通过内置比较隐式转换为普通类型)。如果不止一个是有意义的,那么它会进入重载解决规则。

于 2012-10-29T18:03:15.410 回答
3

如果您的意思是“两种语法何时不等价”,那么答案是当相等运算符不是任何类型的成员时first。显然,第二个变体不适用于没有 member 的类型operator==。这包括内置类型。

当类型 of 确实存在成员运算符时first,两者不同,因为非成员运算符可以允许对firstand进行类型转换second,而具有成员运算符的示例仅允许对 进行转换second

于 2012-10-29T17:56:13.973 回答
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:错误:请求'x'中的成员'operator ==',它是非类类型'int'</p>

于 2012-10-29T18:05:21.023 回答
0

第二个不适用于原语。但是,这两种形式都适用于公开重载该运算符的自定义类型。

于 2012-10-29T17:58:37.280 回答
0

如果您的问题仅基于语法,那么它取决于参数的类型。考虑以下代码:

#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;
  }

}

在此设置中,两个运算符都被调用。如果函数类型参数相同,似乎会优先选择该方法。

于 2012-10-29T18:08:08.060 回答