匿名命名空间内的“using namespace”语句

时间:2012-01-08 05:16:25

标签: c++ namespaces

在匿名命名空间中使用using namespace语句时,将使用的命名空间带入文件范围?例如:

namespace foo
{
    int f() { return 1; }
}
namespace
{
    using namespace foo;
}
int a()
{
    return f(); // Will this compile?
}

3 个答案:

答案 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;
}