如何解释标准的以下段落?

时间:2014-05-31 05:57:02

标签: c++ c++11 namespaces scope language-lawyer

§3.3.6/ 1(C ++ 11)

  

namespace-definition 的声明区域是 namespace-body 。潜在的范围表示为    original-namespace-name 是由每个声明区域建立的声明性区域的串联    namespace-definitions original-namespace-name在同一声明区域中。 ...

声明性区域的定义如下(§3.3.1/ 1):

  

每个名称都在程序文本的某些部分中引入,称为声明性区域,这是最大的部分   该名称有效的程序,即该名称可用作非限定名称的程序   引用同一个实体。 ...

两者结合在一起似乎意味着命名空间的名称只能在命名空间体本身内使用(不合格)。但是,显然,这是错误的。那么,当命名空间的名称实际上可以在命名空间体外使用(不合格)时,命名空间定义的声明区域是什么意味着什么呢?

另外,我根本不理解这一点(从上面重新引用):

  

表示的潜在范围    original-namespace-name 是由每个声明区域建立的声明性区域的串联    namespace-definitions original-namespace-name在同一声明区域中。

1 个答案:

答案 0 :(得分:5)

标准不是在谈论你的想法......

我认为你的混淆在于你错误地认为文本是关于命名空间名称本身的事实,当标准真的在讨论在所讨论的命名空间内引入的名称时。


引用的“只是没有意义”的内容怎么样?

  

original-namespace-name表示的潜在范围是由同一声明性区域中的每个名称空间定义与原始名称空间名称建立的声明性区域的串联。


以上可能最容易用一个例子来描述:

.--- namespace definition
|        .--- original-namespace-name
v        v
namespace N { <-------------------------------.
  int x = 0;                              <---+--- declarative region (1)
} <-------------------------------------------'

.--- another namespace definition of `N`
|         .--- original-namespace-name
v         v
namespace N { <-------------------------------.
  int y = x;                              <---+--- declarative region (2)
} <-------------------------------------------'

注意int x的潜在范围是(1)(2),即。 “声明区域的连接”介绍。功能

  • 在示例中,我们为 original-namespace-name N提供了两个 namespace-definitions ,我们还有两个声明区域,但名为N的命名空间内的“潜在范围”都是(1)(2)

  • 只要名称空间定义本身位于相同的声明区域中,并共享相同的原始名称空间名称 ,它们引用相同的命名空间。

  • 引入另一个此类命名空间定义只会为潜在范围(通过附加另一个声明性区域)添加更多空间先前在其中声明的变量。


潜在范围声明性区域;它们是什么?

  • declarative region 是程序的一部分,可以在不合格的情况下引用名称。

  • potential scope 是名称​​可能有效的范围,它是名称可以<的整个范围/ strong>指的是同一个实体。


  

3.3.1p1 声明性区域和范围 [basic.scope.declarative]

     
    

程序文本的某些部分引入了每个名称,称为声明区域,这是该名称​​有效的程序的最大部分,即其中名称可以用作非限定名称来引用同一实体。

         

通常,每个特定名称仅在称为范围的程序文本的某些可能不连续部分内有效。要确定声明的范围,有时可以灵活地引用声明的潜在范围

         

声明的范围与其潜在范围相同,除非潜在范围包含另一个同名声明。在这种情况下,内部(包含)声明性区域中声明的潜在范围被排除在外部(包含)声明性区域中的声明范围之外。