通过使用其他命名空间元素

时间:2015-07-22 09:59:56

标签: c++

看看这个简单的片段:

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::考虑以上行?
  3. (Visual Studio 2008和gcc4.8给出相同的结果,所以我认为这是标准行为,但我想知道标准的哪一部分定义了它?)

1 个答案:

答案 0 :(得分:2)

这是Argument-dependent name lookup,a.k.a。Koenig查找(尽管Andrew Koenig did not invent it)。它在标准中的同名章节中定义。

它支持以下内容:

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

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

对于在其参数的命名空间中查找的函数,,而不是相反(您的示例2),这将进一步弱化命名空间障碍与案例1相当的好处。

更深入地讨论主题here