结构名称不遮盖变量名称

struct name not shadowing variable name

本文关键字:变量名 结构      更新时间:2023-10-16

我注意到以下代码使用最新的编译器进行编译:

int main()
{
    int x;
    struct x;
    x = 210;                  // ←
}

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

查找规则是否在 C++11 或 C++14 中更改以使此代码"工作"(从而中断使用 struct variable_name; 作为确保在以下代码中不使用变量的方法)?


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

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

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

[basic.scope.hiding]/2 类名 (9.1) 或枚举名 (7.2) 可以通过在同一作用域中声明的变量、数据成员、函数或枚举器的名称来隐藏。如果类或枚举名称以及变量、数据成员、函数或枚举器在同一作用域(以任意顺序)声明,则在变量、数据成员、函数或枚举器名称可见的任何位置,类或枚举名称都将隐藏。

这种语言自 98 年C++以来一直存在。如果您见过一个工作方式不同的编译器,那么该编译器是预标准的,或者只是普通的错误。

你所做的是转发struct x声明。您没有声明新变量x 。例:

struct foo;
int foo;
struct foo {
    int foo;
};
struct foo thisisfoovariable;

上面是只有两个变量的声明:foo(类型int)和thisisfoovariable,类型为struct foo