【发布时间】:2015-12-29 05:23:55
【问题描述】:
从 N4567 开始的标准禁止对先前在 条件 中声明的名称进行某些类型的重新声明,如下所示 - 根据标准(§3.3.3/4):
在 for-init-statement、for-range-declaration 以及 if、while、for 和 switch 语句的条件中声明的名称对于 if、while、for 或 switch 语句是局部的(包括受控语句),并且不应在在该语句的后续条件中或在受控语句的最外层块(或者,对于 if 语句,任何最外层块)中重新声明;见 6.4。
但是,考虑到以下代码可以正常编译,
int main(void) {
if (int i=10)
if (int i=20)
;
return 0;
}
我似乎不清楚“该语句的后续条件”究竟代表什么。
【问题讨论】:
-
可能是指
for的情况:for(int i = 0; int i = 1;);。在i的初始声明之后有一个后续条件。if的措辞虽然是“任何最外层的块”,但表示它认为if的 else 分支是if的一部分,所以我认为它也可能指的是if(int i = 1) ; else if(int i = 1) ;。 -
我认为这是在同一条件下两次声明一个名称。这是两个不同的
if语句,具有不同的条件。 -
啊,结构是
if(...) stmt; else stmt,所以我不认为我的例子与两个ifs匹配。 “任何最外面的块”显然是指if(int i = 1) { int i = 2; } else { int i = 3; },而不是if(int i = 1) ; else if(...) { int i = 2; }(IMO)。 -
@JohannesSchaub-litb 我同意您指出的措辞是用于 for 声明。
-
@Cornstalks 这就是我遇到那段时的想法。确实,它们不属于同一个语句。
标签: c++ language-lawyer