通过继承类使用来自不同命名空间的运算符
Using operators from different namespace through inherited class?
以下代码是如何编译(并打印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
是一个类类型(包括并集(,则其关联的类为:类本身;其所属类别(如有(;及其直接和间接基类。其关联的名称空间是其关联类的最里面的封闭名称空间。
因此,当编译器正在寻找应用于类型A
的operator+
时,它也会在名称空间V
中进行搜索,因为A
有一个基类是V
的成员。
相关文章:
- 通过继承类使用来自不同命名空间的运算符
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 在类设计中查找外部命名空间中的重载运算符
- 重载运算符 + 用于向量:命名空间标准
- 为什么 std::variant 找不到运算符<() 当与比较类不在同一命名空间中时
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- C++命名空间、内部类和运算符解析
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- 在命名空间内的类中使用带有运算符重载的字符串流时"no match for ‘operator>>’"
- 在命名空间内的 lambda 中使用时未找到运算符重载
- 如何在命名空间中引用用户定义的文本运算符
- 为命名空间中的类重载运算符<<时发出警告
- 为在与类方法中的类相同的命名空间中定义的结构调用重载运算符
- 在 std::find 中使用来自不同命名空间的运算符
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 为什么命名空间中的函数看不到全局定义的运算符<<?
- 基于 SFINAE 的跨命名空间的运算符重载
- 如何在不同的命名空间中指定重载运算符
- 如何使 [std::运算符 " " s] 在命名空间中可见?