结构名称不影响变量名称

时间:2016-01-17 15:11:22

标签: c++ c++11 c++14

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

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()
{
}

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

2 个答案:

答案 0 :(得分:8)

  

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

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

答案 1 :(得分:0)

您所做的是struct x的前瞻性声明。您没有声明名为x的新变量。例如:

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

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