通过使用其他名称空间元素传播的名称空间外部可见性

visibility outside namespace propagated by usage of other namespace elements

本文关键字:空间 传播 外部 可见性 元素 其他      更新时间:2023-10-16

看一下这个简单的代码片段:

namespace Test
{
    struct A {};
    void foo( A _a ) {}
}

int main( int, char** )
{
    foo( Test::A() ); // 1. why foo doesn't require Test:: ?
    Test::foo( A() ); // 2. why A() requires Test:: considering above line?
    return 0;
}

如来源所述:

  1. foo( Test::A() );为什么foo在这里不需要Test:: ?
  2. Test::foo( A() );为什么A()需要Test::考虑上面的行?

(Visual Studio 2008和gcc4.8给出相同的结果,所以我想这是标准的行为,但我想知道标准的哪一部分定义它?)

这是依赖于参数的名称查找,又名Koenig查找(尽管Andrew Koenig并没有发明它)。它在标准的同名章节中定义。

它支持如下操作:

std::string str( "Hello world!" );
std::cout << str;

重载operator<<( std::ostream &, std::string )位于std::命名空间中——如果没有ADL, 将无法找到

对于在其参数的命名空间中查找的函数,只能起作用,而不是反过来(示例2),这将进一步削弱命名空间障碍,而没有与案例1相比的好处。


在这里有更深入的讨论