the following piece of code如何编译(并打印V::operator+
)?
#include <iostream>
namespace V {
struct B {};
template<typename T>
auto operator+(T rhs) -> T {
std::cout << "V::operator+\n";
return rhs;
}
}
struct A : V::B {};
int main() {
+A();
}
类A
在命名空间V
外部,并且继承自B
内部的V
。 V
还包含一个运算符模板,例如可以在B
上使用。
在operator+
之外没有为A
定义V
,但是可以在A
上调用它而没有任何限制(类似于V::operator+(A())
)。删除继承会产生预期的错误'operator+' not defined
。
为什么不能在V
之外无条件使用此运算符?
答案 0 :(得分:2)
依赖于参数的查找扩展到基类的名称空间。 [basic.lookup.argdep] /2.2:
如果
T
是类类型(包括并集),则其关联的类为:类本身;它所属的类(如果有);及其直接和间接基类。其关联的名称空间是其关联类的最内部封闭的名称空间。
因此,当编译器正在寻找适用于类型operator+
的{{1}}时,它也会在命名空间A
中进行搜索,因为V
的基类是A
的成员。