看看这个简单的片段:
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;
}
如消息来源所述:
foo( Test::A() );
为什么foo
这里不需要Test::
?Test::foo( A() );
为什么A()
要求Test::
考虑以上行?(Visual Studio 2008和gcc4.8给出相同的结果,所以我认为这是标准行为,但我想知道标准的哪一部分定义了它?)
答案 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。