C++重新声明循环计数变量不一致的行为?

101*_*001 31 c++ scope for-loop visual-studio-2010

我在Visual Studio 2010中做C++并发现了一些奇怪的行为.长话短说,我发现这不会编译:

for (int i = 0; i < 10; i++)
{
    int i = 11;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是正确的,因为变量i已经在for循环头中声明.

现在,如果我在重新声明i之前插入另一个for循环,那么突然编译器,intellisense等thiks代码是正确的 - 没有给出真正的警告(尝试警告级别3和4(/ W3和/ w4)) .所以,这样做实际上将编译并运行:

for (int i = 0; i < 10; i++)
{
    for(int j = 0; j < 5; j++)
    {
    }

    int i = 11;
}
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我觉得奇怪的是,在另一个for循环中使用其他相同的代码场景是合法的.任何善良的精神能告诉我我在这里俯瞰什么?

提前致谢!

编辑: 哇,谢谢大家的所有回复和演示 - 你太棒了!:)这个揭露错误的样本确实让我想到了,我只是假设MS现在已经注意到这样的事情并修复它......至少在VS2013中.

尝试按照建议更改优化设置,但它没有任何区别.

谢谢大家!

第一段代码

第二段代码

演示来源:@Mark Garcia

mas*_*oud 19

根据标准规范:

1 ...在for-init-statement中声明的名称与条件中声明的名称在同一声明区域中

3如果for-init-statement是声明,则声明的名称范围将扩展到for语句的末尾.[§6.5.3]

4 在for-init-statement,for-range-declaration以及if,while,for和switch语句的条件中声明的名称是if,while,for或switch语句的本地名称(包括受控语句) ),并且不得在该陈述的后续条件中,也不得在受控陈述的最外层(或,对于if陈述,任何最外面的块)重新宣布[§3.3.3]

MSVC++ 2010的行为不是标准的,这是一个错误.