5

我正在研究 C++ 标准以了解操作、表达式、语句和副作用的顺序。

一个相关的问题是名称的“声明点”。在 C++11 标准的第 3.3.2.1 节中,标准规定:

名称的声明点紧跟在它的完整声明符(第 8 条)之后和它的初始化器(如果有的话)之前......

以下段落添加了一个带有示例的注释:

注意:来自外部范围的名称在隐藏它的名称的声明点之前保持可见。

... 举个例子

const int i = 2;
{ int i[i]; }

并且注释指出此代码示例“声明了一个由两个整数组成的块范围数组”。

我希望能够查看示例代码,并通过应用“声明点”的定义以及有关名称从外部范围的可见性的注释,能够查看该代码并得出合乎逻辑的我自己的结论是,它是格式良好的代码,它可以完成它看起来要做的事情。

但是,基于这些定义和规则,我无法理解如何查看此代码并得出此结论。

从左到右阅读,i[]数组的声明似乎出现在使用外部作用域之前,因此“在声明点之前i保持可见”的含义不能表示从左到右阅读感觉。

直到声明点”必须意味着类似于“操作顺序”的意思。

C++ 标准中的什么定义或规则规定在数组声明中,数组名称的“声明点”出现在方括号内的表达式“之后”?在这种情况下,“之后”到底是什么意思?

4

2 回答 2

11

"complete declarator" --> Declarator 包括[]和它们的内容。也就是说,上面的完整声明器是i[i],所以它只有在那之后才被声明。

于 2012-12-06T19:05:36.563 回答
1

声明点紧跟在完整声明符之后。因此,外部i还没有隐藏在声明器本身内部。

于 2012-12-06T19:07:00.933 回答