没有关于好风格的争论,我只是对标准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;
}
答案 0 :(得分:0)
Quoting the manual ,因为变量和类型位于不同的范围内。
[C++14: 3.3.10/2]:
类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏。如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见。
Clang和Visual Studio错了。