以下代码有operator+
的2个定义 - 一个在类Foo
上,另一个是独立函数。
我觉得编译器应该抱怨这个,但它没有。当我在main函数中使用operator+
时,它会选择类中定义的那个。当我删除类中的那个时,它开始使用独立函数。
删除类方法以静默方式更改C ++程序的行为这一事实非常令人担忧。这背后有理由吗?
#include <iostream>
class Foo
{
public:
int operator+(const Foo& b)
{
return 5;
}
};
int operator+(const Foo& a, const Foo& b)
{
return 6;
}
int main()
{
Foo a, b;
int c{ a + b };
std::wcout << c << std::endl;
return 0;
}
答案 0 :(得分:7)
这两个签名并不真正匹配,因为第一个对第一个操作数采用非const引用。要“修复”这个,请将其设为const:
int operator+(const Foo& b) const
或制作非成员非const的第一个参数(不要在实际代码中执行此操作!)
int operator+(Foo& a, const Foo& b)
这将导致您的代码产生不明确的重载编译器诊断。
使用原始代码,选择成员,因为非const引用更好地匹配操作数。
答案 1 :(得分:2)
这类似于基于const
和非const
限定符的重载。
int operator+(const Foo& a, const Foo& b)
{
return 6;
}
就像const
成员函数。
鉴于
Foo a;
Foo const b;
Foo c;
a + c; // Resolves to the non-const member function.
b + c; // Resolves to the non-member function since the first argument
// is of type `const Foo&`.