结构名称不影响变量名称

Che*_*Alf 1 c++ c++11 c++14

我注意到以下代码编译了最近的编译器:

int main()
{
    int x;
    struct x;
    x = 210;                  // ?
}
Run Code Online (Sandbox Code Playgroud)

我记得几年前它没有编译.

是否在C++ 11或C++ 14中更改了查找规则以使此代码"正常工作"(从而打破使用struct variable_name;以确保在以下代码中不使用该变量)?


更新:显然我记得错了.我已经验证了即使使用Visual C++ 2010也可以编译好的代码.但是,当用于参数时,struct名称位于内部作用域和阴影中,如下面的代码所示:

void foo( int x )
{
    struct x;
    x = 210;                  // ? Error
}

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

因此,我选择了"解决方案",没有改变的答案; 规则总是这样.

Igo*_*nik 8

[basic.scope.hiding]/2类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏.如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见.

这种语言自C++ 98以来就已存在.如果您看到编译器的工作方式不同,那么该编译器是预标准的,或者只是简单的错误.