拥有一个与其类型同名的成员变量是否合法?

时间:2016-07-15 10:26:21

标签: c++

没有关于好风格的争论,我只是对标准c ++中的合法内容感兴趣。这是一个很小的代码中出现的一个小例子。

Clang和Visual Studio编译时没有错误,看起来效果非常好。我甚至都没有收到任何警告。

GCC给出以下错误,甚至拒绝编译代码......

  

test.cpp:1:8:错误:改变' test'的含义来自' struct test'   [-fpermissive]

这是合法代码吗? 我理解gcc在说什么,但这段代码实际上是错误的吗?

struct test
{
    int data;
};


struct app
{
    test test;
};

int main()
{
    app myapp;
    myapp.test.data = 123;
}

1 个答案:

答案 0 :(得分:0)

Quoting the manual ,因为变量和类型位于不同的范围内。

It's invalid

  

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

Clang和Visual Studio错了。