Bri*_*ian 3 c++ scope namespaces language-lawyer c++11
§3.3.6/ 1(C++ 11)
命名空间定义的声明性区域是其namespace-body.原始名称空间名称表示的潜在范围是由同一声明性区域中的每个名称空间定义与原始名称空间名称建立的声明性区域的串联 ....
声明区域的定义如下(§3.3.1/ 1):
每个名称都在程序文本的某些部分中引入,称为声明性区域,该声明区域是该名称有效的程序的最大部分,也就是说,该名称可以用作非限定名称以引用同一实体....
两者结合在一起似乎暗示命名空间的名称只能在命名空间体本身内使用(不合格).但是,显然,这是错误的.那么,当命名空间的名称实际上可以在命名空间体外使用(不合格)时,命名空间定义的声明区域是什么意味着什么呢?
另外,我根本不理解这一点(从上面重新引用):
原始名称空间名称表示的潜在范围是由同一声明性区域中的每个名称空间定义与原始名称空间名称建立的声明性区域的串联 .
我认为你的困惑在于你错误地认为文本是关于命名空间名称本身的事实,当标准真的在谈论在有问题的命名空间内引入的名称时.
原始名称空间名称表示的潜在范围是由同一声明性区域中的每个名称空间定义与原始名称空间名称建立的声明性区域的串联.
以上可能最容易用一个例子来描述:
.--- namespace definition
| .--- original-namespace-name
v v
namespace N { <-------------------------------.
int x = 0; <---+--- declarative region (1)
} <-------------------------------------------'
Run Code Online (Sandbox Code Playgroud)
.--- another namespace definition of `N`
| .--- original-namespace-name
v v
namespace N { <-------------------------------.
int y = x; <---+--- declarative region (2)
} <-------------------------------------------'
Run Code Online (Sandbox Code Playgroud)
注意:潜在的范围int x
是(1)和(2),即.引入了"声明区域的连接".
在这个例子中,我们有两个名称空间用于原始命名空间名称 N
,我们还有两个声明性区域,但名为命名空间的"潜在范围"N
是(1)和(2).
只要命名空间定义本身位于相同的声明性区域中,并共享相同的原始命名空间名称,它们就会引用相同的命名空间.
引入另一个这样的命名空间定义只会为之前在其中声明的变量的潜在范围(通过附加另一个声明性区域)增加更多空间.
潜在范围和声明区域 ; 这些是什么?
a declarative region
是程序的一部分,可以在不合格的情况下引用名称.
的potential scope
是,其中一个名字的范围可能有效,它在该名称的整个范围可能指的是同一实体.
3.3.1p1
声明性区域和范围[basic.scope.declarative]
每个名称都在程序文本的某些部分中引入,称为声明性区域,该声明区域是该名称有效的程序的最大部分,也就是说,该名称可以用作非限定名称以引用同一实体.
通常,每个特定名称仅在称为其范围的程序文本的某些可能不连续部分内有效.为了确定声明的范围,有时可以灵活地引用声明的潜在范围.
除非潜在范围包含另一个同名声明,否则声明的范围与其潜在范围相同.在这种情况下,内部(包含)声明性区域中声明的潜在范围被排除在外部(包含)声明性区域中的声明范围之外.
归档时间: |
|
查看次数: |
120 次 |
最近记录: |