过载分辨率不适用于操作员过载

Overload resolution not applicable to operator overloading

本文关键字:操作员 适用于 分辨率 不适用      更新时间:2023-10-16

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

如果程序包含两个这样的非重载,则程序格式不正确 同一范围内的声明。[ 注意:此限制适用于 作用域中的显式声明,以及此类声明和 通过使用声明 (7.3.3) 进行的声明。它没有 适用于由于名称查找而制造的函数集 (例如,由于 using 指令)或重载分辨率(例如,对于 运算符函数)。—尾注 ]

#include <iostream>
namespace A
{
    int foo(){ return 1; };
}
using namespace A;
int foo(){ return 1; }
int main(){ }

演示

这将形成良好,直到 foo 未被 odr 使用。这很清楚,这反映了我在引文中提供的第一条注释(大约 using-directive 年)。但我不知道该标准对我在引用中强调的运算符函数的重载分辨率意味着什么。你能给我举个例子吗?

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+()。这两个签名仅在返回类型上有所不同。