为什么以下运算符重载是不明确的?

时间:2014-12-01 04:31:34

标签: c++ operator-keyword

在以下代码中:

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

DEMO

标准说N3797:3/8 [basic]

  

如果

,两个名称相同      

- 它们是由相同字符序列组成的标识符,或

     

- 它们是由同一个运算符形成的运算符函数ID,或

     

[...]

我在这个例子中定义并声明了两个具有相同运算符的运算符函数,因此这两个函数具有相同的名称。因此,第一个声明引入了名称,第二个声明定义了一个实体,由该名称表示。怎么了?

2 个答案:

答案 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

涵盖同一范围内重载函数的情况(如我的例子所示)