通过继承的类使用来自不同名称空间的运算符吗?

时间:2018-11-02 18:00:16

标签: c++ templates namespaces operator-overloading

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内部的VV还包含一个运算符模板,例如可以在B上使用。

operator+之外没有为A定义V,但是可以在A上调用它而没有任何限制(类似于V::operator+(A()))。删除继承会产生预期的错误'operator+' not defined

为什么不能在V之外无条件使用此运算符?

1 个答案:

答案 0 :(得分:2)

依赖于参数的查找扩展到基类的名称空间。 [basic.lookup.argdep] /2.2:

  

如果T是类类型(包括并集),则其关联的类为:类本身;它所属的类(如果有);及其直接和间接基类。其关联的名称空间是其关联类的最内部封闭的名称空间。

因此,当编译器正在寻找适用于类型operator+的{​​{1}}时,它也会在命名空间A中进行搜索,因为V的基类是A的成员。