在匿名命名空间中使用using namespace
语句时,将使用的命名空间带入文件范围?例如:
namespace foo
{
int f() { return 1; }
}
namespace
{
using namespace foo;
}
int a()
{
return f(); // Will this compile?
}
答案 0 :(得分:14)
根据7.3.4 [namespace.udir]第4段,命名空间指令是可传递的:
对于非限定查找,指定第二个名称空间本身包含using-directives,效果就好像第二个名称空间中的using-directives也出现在第一个名称空间中一样。
...并且根据7.3.1.1 [namespace.unnamed]第1段,对于未命名的命名空间有一种隐式的using指令:
unnamed-namespace-definition的行为就像它被
替换一样内联命名空间唯一{/ *空体* /}
使用名称空间唯一;
namespace unique {namespace-body}其中inline出现,当且仅当它出现在unnamed-namespace-definition中时,翻译单元中所有出现的unique都会被相同的标识符替换,并且此标识符与整个程序中的所有其他标识符不同。
因此,答案是“是的,这应该编译”(并且它与我尝试过的所有C ++编译器一起使用)。
答案 1 :(得分:3)
是
这是因为匿名命名空间会自动进入包含范围。
答案 2 :(得分:1)
是的,因为正如DietmarKühl所引用的那样,匿名命名空间被其内容所取代。
但是,你应该注意它被替换为声明(编辑)的地方,所以这里没有“魔法”。例如,这不起作用:
namespace foo
{
int f() { return 1; }
}
int a()
{
return f(); // Will this compile?
}
namespace
{
using namespace foo;
}