了解C++运算符的范围

Understanding the scope of operators in C++

本文关键字:范围 运算符 C++ 了解      更新时间:2023-10-16
#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(。在这种情况下,这些关联的命名空间是stdFoo的。

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

 std::operator<<(std::ostream&, /* all the builtin types and Standard strings and streams */)
 Foo::operator<<(std::ostream&, const& Baz)

名称查找后,所有std::operator<<重载的参数推断都将失败。这就是为什么重载解析会发现用户定义的Foo::operator<<实际上是唯一的匹配项。这就是为什么它被称为。