【问题标题】:Is it legal to have a member variable with the same name as it's type? [duplicate]拥有与其类型同名的成员变量是否合法? [复制]
【发布时间】:2016-07-15 10:26:20
【问题描述】:

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

Clang 和 Visual Studio 编译它没有错误,它似乎工作得很好。我什至都没有收到任何警告。

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

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

这是否合法? 我明白 gcc 的意思,但是这段代码真的有错误吗?

struct test
{
    int data;
};


struct app
{
    test test;
};

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

【问题讨论】:

  • 数据成员和变量没有区别。
  • @Cheersandhth.-Alf:当然有。
  • @LightnessRacesinOrbit:不。
  • gcc 不会抱怨声明这样的变量:- “test test;”虽然主要......
  • @Cheersandhth.-Alf:数据成员和非成员变量有很多不同之处。您可以选择任何好的 C++ 书籍来了解更多关于类的信息。

标签: c++


【解决方案1】:

It's invalid,因为变量和类型在不同的作用域内。

Hiding kicks in only when they're in the same scope:

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

Clang 和 Visual Studio 是错误的。

【讨论】:

  • −1 所引用的段落完全是关于另一件事的,即名称共存。这是 C 的命名空间,使用 struct 关键字解析。
  • @Cheersandhth.-Alf:什么?你甚至读过答案吗?这一段只允许在名称共存时隐藏。
  • (我可以引用标准的整个其余部分来证明没有规则允许它用于 OP 的情况,但 SO 答案有最大大小限制)
  • 您引用的段落是关于在与用于类名或枚举的相同范围内重用名称。早期的 C(以及后来的 C 和现在的 C++)允许这样做,因为您将在需要引用类型的地方使用 struct 或 enum 关键字。当类或枚举在封闭范围内声明时,这根本不是问题。然后就是普通的名字隐藏了。
  • 我最好补充一点,欺骗表明上面的结论在第一个逗号之前是正确的:它是无效的。但不是因为引用的原因
猜你喜欢
  • 2017-08-17
  • 2021-07-06
  • 2021-02-13
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多