#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();
}
我定义了一个 operator<<
在Foo
命名空间。为什么可以从全局范围调用?
最佳答案
DRTL
编译器可以找到用户定义的operator<<
通过参数依赖查找。
解释
电话
std::cout << Foo::Baz();
实际上是
的中缀简写 operator<<(std::cout, Foo::Baz());
因为函数调用是不合格的(即没有任何 namespace 前缀或括号),编译器不仅会进行普通名称查找(从局部函数范围向外),还有参数依赖查找(又名 ADL)用于函数的其他重载 operator<<
在两个参数的所有关联命名空间中 std::cout
和类 Baz
.这些关联的命名空间是 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<<
实际上是唯一的匹配项。这就是它被称为的原因。
关于c++ - 了解 C++ 中运算符的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17084665/