c++ - 为什么以下运算符重载不明确?

标签 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]:

Two names are the same if

— they are identifiers composed of the same character sequence, or

— they are operator-function-ids formed with the same operator, or

[...]

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

最佳答案

这两个函数的名称不同。第一个是 A::operator+(A),第二个是 operator+(A,A)。因此,它们是两个不同的函数,实际上只定义了第二个。

毕竟,给类 Foo 一个名为 bar() 的方法与定义一个函数 bar(Foo) 是不一样的。为什么运算符应该有所不同?

关于c++ - 为什么以下运算符重载不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27221737/

相关文章:

python - 如何将列表中的所有元素相互相乘?

c++ - 为什么在 Doom 源代码中有#define ID_INLINE 内联定义?

c++ - 当字符串包含一个值时,为什么 string.empty() 的计算结果为真?

c++ - 引用类型转换运算符 : asking for trouble?

function - Haskell 运算符与函数优先级

c++ - 错误 C2228 : left of '.values' must have class/struct/union

c++ - ostream 重载 for 循环,没有返回值

c++ - Qt中如何让默认的UI元素更漂亮?

c++ - 函数不会接受 Lambda 但会接受函数指针

C++ printf WORD*(ToAscii)