这两种未命名命名空间的嵌套用法之间是否存在功能上的差别:
namespace A { namespace {
void foo() {/*...*/}
}}
和
namespace { namespace A {
void foo() {/*...*/}
}}
就我所看到的,每个编译单元都会为两个foo
分配一个内部唯一标识符,并且可以使用A::foo
访问它们-但是我是否有任何细微或不太明显的差异没有看到?
这两种未命名命名空间的嵌套用法之间是否存在功能上的差别:
namespace A { namespace {
void foo() {/*...*/}
}}
和
namespace { namespace A {
void foo() {/*...*/}
}}
就我所看到的,每个编译单元都会为两个foo
分配一个内部唯一标识符,并且可以使用A::foo
访问它们-但是我是否有任何细微或不太明显的差异没有看到?
与您输入的完全一样,没有区别。
当然,您可以在第一级命名空间中添加声明以展示不同之处,这样就会有所不同。
namespace A {
int i; // Accessed globally in this file as "A::i".
namespace {
void foo() {/*...*/}
}}
namespace {
int i; // Accessed globally in this file simply as "i".
namespace A {
void foo() {/*...*/}
}}}
unnamed_namespaces.cpp:42:5: error: reference to ‘A’ is ambiguous
unnamed_namespaces.cpp:19:17: error: candidates are: namespace A { }
unnamed_namespaces.cpp:28:19: error: namespace <unnamed>::A { }
有用:
编辑:
关于ADL(Argument-dependent name lookup),我理解对于其他foo()
的重载决议不会有优先级差异,如下所示:
#include <iostream>
void foo() { std::cout << "::foo()" << std::endl; }
namespace A {
namespace {
void foo() { std::cout << "A::<unnamed>::foo()" << std::endl; }
class AClass
{
public:
AClass( )
{ foo( ); }
};
}
}
namespace {
namespace B {
void foo() { std::cout << "B::<unnamed>::foo()" << std::endl; }
using namespace A;
class BClass
{
public:
BClass( )
{ foo( ); }
~BClass( )
{ A::foo( ); }
};
}
}
int main( )
{
A::foo( );
B::foo( );
foo( );
A::AClass a;
B::BClass b;
return 0;
}
编译器会优先选择最近的foo( )
,除非显式指定。
因此,即使在BClass
构造函数中有using namespace A
语句,BClass
构造函数还是调用了B::foo( )
。
要在BClass
析构函数中调用A::foo( )
,必须显式限定调用。
A::<unnamed>::foo()
B::<unnamed>::foo()
::foo()
A::<unnamed>::foo()
B::<unnamed>::foo()
A::<unnamed>::foo()
A::i
,第二个只是 i
。 - Dennis Zickefoosenamespace A {void bar();}
是否能够在任何示例中找到 foo()
? - ltjax
A::foo
来有效地隐藏第二个foo
。第一个foo
将始终可访问为::A::foo
。除非你重新打开A
并在那里声明另一个foo
。也就是说,这几乎是相同的。 - n. m.