如何解释来自C++标准的示例“const int i = 2; { int i [i]; }”中的“声明点”?

5
我正在研究C++标准,以理解操作顺序、表达式、语句和副作用。
相关问题是名称的“声明点”。在C++11标准的§3.3.2.1节中,标准规定:
“一个名称的声明点是在其完整的声明符(第8条)之后,其初始化器(如果有的话)之前...”
以下段落添加了一个带有示例的注释:
“注意:外部范围名称的名称仍然可见,直到隐藏它的名称的声明点。”
... 其中包括以下示例。
const int i = 2;
{ int i[i]; }

该注释指出,此代码示例“声明了一个包含两个整数的块作用域数组”。

我希望能够查看示例代码,并通过应用“声明点”的定义以及关于外部作用域名称可见性的说明,自己得出这是良好形式的代码并且执行其预期功能的逻辑结论。

然而,根据这些定义和规则,我无法理解如何查看此代码并得出这个结论。

从左到右阅读,i[] 数组的声明似乎出现在来自外部作用域的 i 的使用之前,因此“保持可见性直至声明点”这个意思不能从左到右的阅读方式理解。

“直至声明点”必须在某种程度上意味着“操作顺序”方面的内容。

C++标准中的哪个定义或规则规定,在数组声明中,数组名称的“声明点”发生在方括号内表达式之后?在这种情况下,“之后”具体指什么?

2个回答

11

"完整声明符" --> 声明符包括[]和它们的内容。也就是说,以上的完整声明符是i[i],因此只有在这之后才会被声明。


完整的声明符是仅仅 i[i],还是 int i[i] - Dan Nissenbaum
2
@H2C03 我认为第一个类型是声明的一部分而不是说明符。在int i [5],j中,整个内容都是声明,i [5]j是说明符。我认为这是一条奇怪的语法规则(可以看到像int (*foo)(),j之类的东西),但我想它可能是从C继承过来的。无论你怎么看待它,声明的重点是在]之后。 - Joseph Mansfield
2
不要混淆“声明”和“声明符”的差异。声明是int i[i],但声明符只是i[i]。请参考C++标准的语法部分。 - tjltjl
1
完整的声明符号是 i[i]。声明符号是语法的一部分,不包括初始类型。 "声明符号在声明中声明单个变量、函数或类型。" - Joseph Mansfield
3
这是正确的,然而应该知道,并非所有编译器都在此方面正确实现规范。例如。 - bames53
显示剩余4条评论

1
声明的位置是在完整的声明符之后,因此外部的 i 在声明符本身内部尚未被隐藏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接