c++ - 了解 C++ 中运算符的范围

标签 c++ function namespaces scope argument-dependent-lookup

#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 .这些关联的命名空间是 stdFoo在这种情况下。

因此依赖于参数的查找将找到定义

 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/

相关文章:

c++ - 用C++在文件中输入长短语

jquery - 在 jQuery 1.7.2 中 ("click") 和 ("click.randomText") 之间有什么区别?

c++ - C++17 中的数组赋值

c++ - 优化 Alpha 混合

c++ - 基类声明虚函数,其参数类型取决于实现类

c++将函数参数(带有模板变量的结构)转换为函数体内的字符串

C编程: malloc() inside another function

oracle - 从 PLSQL 中的表派生函数

Clojure - 如何让库用户选择使用哪种打印功能,以显示数据结构?

xml - XSL : Avoid exporting namespace definitions to resulting XML documents