【问题标题】:What is the difference between enum struct and enum class?枚举结构和枚举类有什么区别?
【发布时间】:2016-11-26 22:55:20
【问题描述】:

看着enum documentation,我注意到了一件事:

枚举键 - enumenum class(自 C++11 起)或 enum struct(自 C++11 起)之一

enumenum class,当然可以,但 enum struct 是什么?

文档似乎说enum classenum struct 完全相同:

[...] 范围枚举(用 enum-key enum classenum struct 声明)


  • enum struct|class 姓名 { enumerator = constexpr , enumerator = constexpr , ... }
  • [...]

它们真的完全一样吗?还是我错过了任何差异?对同一事物使用两种不同的语法有什么意义(如果它们相同)?

【问题讨论】:

  • 不包括这两种语法有什么意义?考虑到结构和类在 c++ 中通常是等价的(除了公共/私有),这是有道理的。

标签: c++ c++11 enums


【解决方案1】:

enum classenum struct 是相同的(强调我的)。

7.2 枚举声明
...
2 .... 枚举键 enum class 和 @ 987654324@ 是语义上等价的; 用其中之一声明的枚举类型是作用域枚举,并且它的枚举器作用域的 枚举器.

【讨论】:

    【解决方案2】:

    enum class,当然可以,但是enum struct 是什么?

    enum class

    它们真的完全一样吗?

    是的。文档是正确的。

    或者有什么我遗漏的区别?

    没有。没有区别。

    同一事物有两种不同的语法有什么意义(如果它们相同)?

    我还没有找到任何书面理由来解释这个决定。标准和提案中都没有。有人可能会猜测它是classstruct 类键的某种对应物。这与指定 template<class T> 语法时做出的决定相反,其中不允许使用 struct

    【讨论】:

    • 但是template<typename T>是允许的,也相当于template<class T>!标准在这两点上相当混乱,不是吗?
    • @ZeeByeZon: 否。classstruct 在类型声明中接近同义词很常见。唯一的区别是其成员的默认公共/私人访问权限。由于作用域枚举没有私有成员,因此两者之间的唯一区别是没有意义的。
    • @NicolBolas 不只是会员。它也会影响继承。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2016-01-02
    • 2018-09-25
    • 2013-05-06
    • 2014-09-07
    相关资源
    最近更新 更多