我注意到以下代码编译了最近的编译器:
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)
因此,我选择了"解决方案",没有改变的答案; 规则总是这样.
[basic.scope.hiding]/2类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏.如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见.
这种语言自C++ 98以来就已存在.如果您看到编译器的工作方式不同,那么该编译器是预标准的,或者只是简单的错误.
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |