了解C++运算符的范围
Understanding the scope of operators in C++
#include <iostream>
namespace Foo
{
class Baz { };
std::ostream& operator<< ( std::ostream& ostream , const Baz& baz )
{
return ostream << "operator<<n";
}
}
int main()
{
std::cout << Foo::Baz();
}
我在Foo
命名空间中定义了一个operator<<
。为什么可以从全局范围调用它?
DRTL
编译器可以通过依赖于参数的查找来查找用户定义的operator<<
。
解释
电话会议
std::cout << Foo::Baz();
实际上是中缀的简写
operator<<(std::cout, Foo::Baz());
由于函数调用是非限定的(即没有任何命名空间前缀或周围的括号(,编译器不仅会执行普通名称查找(从本地函数范围向外(,还会对参数std::cout
和类Baz
的所有关联命名空间中的函数operator<<
的其他重载进行依赖于参数的查找(又名 ADL(。在这种情况下,这些关联的命名空间是std
和Foo
的。
因此,依赖于参数的查找将找到定义
std::operator<<(std::ostream&, /* all the builtin types and Standard strings and streams */)
Foo::operator<<(std::ostream&, const& Baz)
名称查找后,所有std::operator<<
重载的参数推断都将失败。这就是为什么重载解析会发现用户定义的Foo::operator<<
实际上是唯一的匹配项。这就是为什么它被称为。
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- ::(范围解析运算符)前面没有任何东西
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 迭代器的范围 TS 和 C++20 概念是否需要能够使用"运算符>"?
- 运算符重载中的范围运算符
- 重载运算符 [] 以接受范围
- 为什么按位运算符在使用与整数中提供的位数相同的位数计算可能的最大范围时会产生错误
- 为什么C++找不到布尔运算符,当有一个!范围内的运算符?
- 运算符>的范围
- 范围分辨率运算符在类型:: var的情况下返回什么
- 如何在C 中访问无范围分辨率运算符的标头构件类型
- 为什么我们要把 :: (范围重新定位运算符)放在迭代器之前
- 删除复制构造函数和运算符=类范围访问
- 为什么可以使用范围运算符和类 A 名称在类 B 中访问类 A(公共)中的枚举
- 友元运算符中的变量范围
- C++是否提供了一种在没有范围解析运算符的情况下访问类中的类的方法?
- 范围运算符需要查找 std 命名空间而不是提升
- 为什么使用范围运算符 (::)在C++类初始化之前
- C++范围运算符分组
- 派生列表中的C++范围运算符