过载分辨率不适用于运算符重载

时间:2015-01-01 05:38:39

标签: c++ overloading

N4296:13.1/1 [over.load]处的标准说:

  

如果程序中包含两个不可重载的程序,那么程序就会格式不正确   声明在同一范围内。 [注意:此限制适用于   范围中的显式声明,以及此类声明和声明之间的声明   通过使用声明(7.3.3)做出的声明。它不是   适用于由于名称查找而制作的函数集   (例如,因为使用指令)或重载决议(例如,用于   操作员功能)。 - 后注]

#include <iostream>

namespace A
{
    int foo(){ return 1; };
}

using namespace A;

int foo(){ return 1; }

int main(){ }

DEMO

这将是良好的形式,直到foo没有使用odr。这很清楚,这反映了我在引文中提供的第一段注释(约using-directive)。但是我不知道标准对于我在引用中强调的操作符函数的重载解析意味着什么。你能举个例子吗?

1 个答案:

答案 0 :(得分:1)

namespace A {
    struct Foo{};
}

namespace B {
    struct Bar{};
}

namespace A {
    int operator+(const A::Foo&, const B::Bar&);
}

namespace B {
    char operator+(const A::Foo&, const B::Bar&);
}

int main() { A::Foo() + B::Bar(); }

ADL同时找到A::operator+()B::operator+()。这两个签名仅在返回类型上有所不同。