如何解释标准中的以下段落?
How is the following passage from the standard to be interpreted?
§3.3.6/1 (c++ 11)
名称空间定义的声明性区域是其名称空间体。表示的潜在范围original- namspace -name是由每个元素建立的声明性区域的连接名称空间定义与original- namspace -name.…声明性区域的定义如下(§3.3.1/1):
每个名称都是在程序文本的某个部分引入的,称为声明性区域,这是最大的部分在该程序中,该名称是有效的,也就是说,该名称可以用作非限定名称引用同一实体. ...
这两个组合在一起似乎意味着名称空间的名称只能(不限定地)在名称空间体本身内部使用。但是,很明显,这是错误的。那么,当名称空间的名称实际上可以在名称空间体之外使用(不限定)时,名称空间定义的声明性区域作为名称空间体是什么意思呢?
还有,我完全不明白这一点(从上面重新引用):
用表示的潜在作用域original- namspace -name是由每个元素建立的声明性区域的连接名称空间定义与原始名称空间名称在同一声明性区域。
标准不是谈论你的想法…
我认为您的困惑在于您错误地假设文本是关于名称空间本身的,而标准实际上是讨论在名称空间内引入的名称。
那引用的"只是没有意义"呢?
original- namespaces -name表示的潜在作用域是由与该original- namespaces -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),即。引入了"声明性区域的连接"。
在这个例子中,我们有两个命名空间定义对于原始命名空间名称
N
,我们也有两个声明性区域,但是"潜在作用域"在命名为N
的命名空间内是(1)和(2)。只要命名空间定义本身位于相同的声明性区域,并且共享相同的original- namspace -name,它们引用相同的命名空间
引入另一个这样的命名空间定义只会为潜在作用域(通过附加另一个声明性区域)先前在其中声明的变量增加更多的空间。
潜在作用域和声明性区域;它们是什么?
a
declarative region
是程序中可以不加限定地引用名称的部分。potential scope
是名称可能有效的作用域,它是名称可以引用同一实体的整个作用域。
3.3.1p1
声明性区域和作用域[basic.scope.declarative]
每个名称都在程序文本中称为声明性区域的某个部分引入,该区域是该名称有效的程序的最大部分,也就是说,该名称可以用作非限定名称来引用同一实体。
一般来说,每个特定的名称只在程序文本中称为作用域的可能不连续的部分内有效。为了确定声明的作用域,有时惯例是引用声明的潜在作用域。
声明的作用域与其潜在作用域相同,除非潜在作用域包含另一个同名的声明。在这种情况下,内部(包含的)声明区域中声明的潜在作用域被排除在外部(包含的)声明区域中的声明作用域之外。
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 标准::变体的赋值运算符
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- C++关于非专用模板的成员模板专业化的标准段落
- C 标准中的哪个段落验证了以下示例中使用的表达式`sizeof(s :: m 42)`
- 如何解释标准中的以下段落?