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

Using operators from different namespace through inherited class?

本文关键字:命名空间 运算符 继承      更新时间:2023-10-16

以下代码是如何编译(并打印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上使用。

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

为什么这个操作员可以在没有资格的情况下在V之外使用?

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

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

因此,当编译器正在寻找应用于类型Aoperator+时,它也会在名称空间V中进行搜索,因为A有一个基类是V的成员。