在以下代码中:
#include <iostream>
#include <initializer_list>
struct A
{
bool operator+(A a);
};
bool operator+(A, A)
{
return false;
}
int main()
{
A a, b;
std::cout << a + b << std::endl;
}
标准说N3797:3/8 [basic]
:
如果
,两个名称相同- 它们是由相同字符序列组成的标识符,或
- 它们是由同一个运算符形成的运算符函数ID,或
[...]
我在这个例子中定义并声明了两个具有相同运算符的运算符函数,因此这两个函数具有相同的名称。因此,第一个声明引入了名称,第二个声明定义了一个实体,由该名称表示。怎么了?
答案 0 :(得分:3)
这两个函数名称不同。第一个是A::operator+(A)
,第二个是operator+(A,A)
。因此,它们是两个不同的功能,实际上只定义了第二个功能。
毕竟,为类Foo
提供名为bar()
的方法与定义函数bar(Foo)
不同。为什么运营商会有所不同?
答案 1 :(得分:1)
在您的代码中,这两个函数具有相同的名称operator+
。但是,可以使用具有相同名称的不同功能。另一个例子是:
int foo();
int foo(int);
这些是具有相同名称的不同功能。
您的代码的相关条款是N3936 [basic.link] / 9:
两个相同的名称(第3条)并且在不同的范围内声明,如果
,则表示相同的变量,函数,类型,枚举器,模板或名称空间。
- 两个名称都有外部链接,或者两个名称都有内部链接,并在同一个翻译单元中声明;和
- 两个名称都指向相同名称空间的成员或成员,而不是继承成员 类;和 [...]
在您的代码中,第二个项目符号点失败,因为一个operator+
是一个类的成员,但另一个不是同一个类的成员。因此,名称表示不同的功能。
[dcl.fct] / 5
涵盖同一范围内重载函数的情况(如我的例子所示)