C++枚举的规范是默认可构造的

Specification that C++ enums are default constructible?

本文关键字:默认 枚举 C++      更新时间:2023-10-16

C++枚举类型似乎是"默认可构造的":

enum UE { a=1, b, c };
enum class SE { a=1, b, c };
int main() {
    UE ue;
    SE se;
}

如何从标准中解释这一点?

我的意思是 - 假设我们想更改标准以使其不是默认可构造的。 哪些条款会改变?

这一切都在 [dcl.init]/7 中:

默认初始化 T 类型的对象意味着:

  • 如果 T 是(可能符合 cv 条件的)类类型,则考虑构造函数。枚举适用的构造函数 ([over.match.ctor]),并选择初始值设定项 () 的最佳一个 通过过载解析。这样选择的构造函数称为, 使用空参数列表来初始化对象。

  • 如果 T 是数组类型,则默认初始化每个元素。

  • 否则,不执行初始化。

UESE与第三个项目符号匹配,就像基本类型一样。因此,初始化只是一个无操作,并且它们留下了一个不确定的值。

这也是您需要首先处理的项目符号列表,以使枚举不可默认初始化。

不要让class enum class混淆你:它仍然被认为是一种非类类型。作用域枚举的语法恰好选择了class关键字,以免向语言添加另一个保留字。

这里有一个草案规范: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4778.pdf

请参见部分 9.6, 枚举声明。

我想你可能来自Java,其中枚举是类。在C++中,枚举值只是整数常量。常量的类型通常是int尽管可以显式定义。

由于枚举只是一个int,当你声明一个没有初始值设定项的枚举时,不涉及默认构造函数;你只会得到一个未初始化的int