为什么这个循环变量可访问外循环范围?

joh*_*een 6 c++ visual-studio

在浏览一些C++代码时,我遇到了以下几行:

for (int i = 0; i < count; i++) {
        if (&array[i].GetData() == el)
            break;
}
if (i < count) {
   // .. Do something
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到循环计数器变量i可以在循环外部访问!

只是为了确保i循环外部与循环内部的循环相同,我将循环变量名称更改为i1.

for (int i1 = 0; i1 < count; i1++) {
        if (&array[i1].GetData() == el)
            break;
}
if (i < count) {    // COMPILATION ERROR: Identifier i is undefined
   // .. Do something
}
Run Code Online (Sandbox Code Playgroud)

这导致该行的编译错误if(i < count):

标识符'i'未定义.

到底是怎么回事?这对于编译器错误来说太基础了.如果i父作用域中有另一个,则不会出现编译错误.我错过了什么吗?我正在使用Visual Studio 2015.

Cha*_*onX 9

过去,Visual Studio具有扩展for(...)构造中声明的变量的生命周期和可访问性的功能(CC++98标准生成之前从普通行为中保留).默认情况下,在旧项目中启用此行为.

Microsoft意识到这(对于C++)非标准符合行为可能是不合需要的,并提供了/Zc:forScope编译器选项来控制此行为(最近默认情况下启用此开关,恢复标准C++一致性).

检查是否在- > rider /Zc:forScope下的项目设置中设置了.如果没有,请设置它.C++Language

注意:/Zc:forScope-如果您具有依赖于它的遗留代码,您还可以选择设置此处以显式启用非标准行为.