5
#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();
}

I define an operator<< in the Foo namespace. Why it can be called from the global scope?

4

1 回答 1

9

DRTL

编译器可以operator<<通过参数相关的查找找到用户定义的。

解释

通话

 std::cout << Foo::Baz();

实际上是一个中缀速记

 operator<<(std::cout, Foo::Baz());

因为函数调用是不合格的(即没有任何命名空间前缀或周围的括号),编译器不仅会进行普通名称查找(从本地函数范围向外),还会对其他函数重载进行参数相关查找(又名ADL )在arguments和 classoperator<<的所有关联命名空间中。在这种情况下,这些关联的命名空间是和。std::coutBazstdFoo

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

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

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

于 2013-06-13T10:28:47.527 回答