在using namespace
匿名命名空间内使用语句时,将使用的命名空间带入文件范围?例如:
namespace foo
{
int f() { return 1; }
}
namespace
{
using namespace foo;
}
int a()
{
return f(); // Will this compile?
}
Run Code Online (Sandbox Code Playgroud)
Die*_*ühl 15
根据7.3.4 [namespace.udir]第4段,命名空间指令是可传递的:
对于非限定查找,指定第二个名称空间本身包含using-directives,效果就好像第二个名称空间中的using-directives也出现在第一个名称空间中.
...并且根据7.3.1.1 [namespace.unnamed]第1段,对于未命名的命名空间有一种隐式的using指令:
未命名的命名空间定义的行为就像被替换为
内联命名空间唯一{/*空体*/}
使用命名空间唯一;
namespace unique {namespace-body}当且仅当它出现在unnamed-namespace-definition中时,inline才会出现,翻译单元中所有出现的unique都会被相同的标识符替换,并且此标识符与整个程序中的所有其他标识符不同.
因此,答案是"是的,这应该编译"(并且它与我尝试过的所有C++编译器一样).