为什么C ++没有抱怨运算符函数的多个定义?

时间:2018-02-16 06:05:15

标签: c++

以下代码有operator+的2个定义 - 一个在类Foo上,另一个是独立函数。

我觉得编译器应该抱怨这个,但它没有。当我在main函数中使用operator+时,它会选择类中定义的那个。当我删除类中的那个时,它开始使用独立函数。

删除类方法以静默方式更改C ++程序的行为这一事实非常令人担忧。这背后有理由吗?

https://ideone.com/rtfEFP

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

2 个答案:

答案 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&`.