2012-11-29 74 views
7

C++ 03标准7.3.1.1 [namespace.unnamed]段落1:(和C++ 11标准也使用类似的定义)C++无名(匿名)命名空间定义

一种无名-namespace-定义行为就好像它是由

namespace unique { /* empty body */ } 
using namespace unique; 
namespace unique { namespace-body } 

为什么不能被简单地定义如下取代?

namespace unique { namespace-body } 
using namespace unique; 

旁边的问题:MSDN由后面的形式定义。它是否违反了标准技术?

+1

我认为这是因为在'namespace-body'中你可以访问没有额外限定条件的实体,这就要求'使用名称空间唯一'已经生效。 –

+3

@mat在命名空间的主体中,您始终可以参考该命名空间中定义的内容,而无需限定条件 –

+0

@ JohannesSchaub-litb:我知道,我想知道与周围环境发生冲突的效果 –

回答

7

你不能再这样下去了

namespace { typedef int a; ::a x; } 

注意,在随后的namespace { ... },突然你可以。这将是非常不一致的。

还要注意这种情况下,有两个不同的有效成果

namespace A { void f(long); } 
using namespace A; 

namespace { 
    void f(int); 
    void g() { 
    ::f(0); 
    } 
} 

随着ISO C++,这个调用int版本的f。根据您的备选定义,它将调用long版本。

+2

我花了一段时间从你的答案中找出你的意思就是我所表达的意思,“标准中的定义确保名称空间体中声明的名称可以通过使用全局名称空间对它们进行完全限定而引用到名称空间体中。例如 ...” –