如何解释"const int i = 2; {int i [i];}"的"声明点" - 来自C++标准的一个例子?

Dan*_*aum 5 c++ language-lawyer c++11

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

相关问题是名称的"声明点".在C++ 11标准的§3.3.2.1节中,标准规定:

声明的名称是在完整的声明者(第8条)之后和初始化者(如果有的话)之前......

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

注意:外部作用域中的名称在隐藏它的名称声明之前仍然可见.

......举例说明

const int i = 2;
{ int i[i]; }
Run Code Online (Sandbox Code Playgroud)

并且注释声明此代码示例"声明了两个整数的块范围数组".

我希望能够查看示例代码,并通过应用"声明点"的定义以及关于外部作用域中名称可见性的说明,能够查看该代码并进入逻辑结论,我自己,这是一个结构良好的代码,它做了它似乎做的事情.

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

从左到右阅读,i[]数组的声明似乎出现在使用i外部范围之前,因此" 在声明之前仍然可见"的含义并不意味着在阅读中从左到右感.

" 直至宣言 "必须意味着"操作秩序"意义上的某些内容.

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

tjl*_*tjl 11

"完整声明者" - >声明者包括[]其内容.也就是说,上面的完整声明符是i[i],所以它只在那之后被声明.

  • 这是正确的,但应该知道并非所有编译器在这方面都正确地实现了规范.[例如.](https://connect.microsoft.com/VisualStudio/feedback/details/695909/c-parser-places-point-of-declaration-incorrectly-for-some-initialization-syntaxes) (3认同)
  • @ H2C03我认为第一种类型是声明的一部分而不是声明者.在`int i [5],j`中,整个事情是声明,`i [5]`和`j`是声明符.我认为这是一个奇怪的语法规则(见`int(*foo)(),j`),但我认为它是从C继承而来的.无论你看哪种方式,声明点都在`]之后. . (2认同)
  • 不,请注意*declaration*和*declarator*之间的区别.声明是int i [i],但声明者只是我[i].请参阅C++标准的语法部分 (2认同)