C++枚举的规范是默认可构造的
Specification that C++ enums are default constructible?
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 是数组类型,则默认初始化每个元素。
否则,不执行初始化。
UE
和SE
与第三个项目符号匹配,就像基本类型一样。因此,初始化只是一个无操作,并且它们留下了一个不确定的值。
这也是您需要首先处理的项目符号列表,以使枚举不可默认初始化。
不要让class
enum class
混淆你:它仍然被认为是一种非类类型。作用域枚举的语法恰好选择了class
关键字,以免向语言添加另一个保留字。
这里有一个草案规范: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4778.pdf
请参见部分 9.6, 枚举声明。
我想你可能来自Java,其中枚举是类。在C++中,枚举值只是整数常量。常量的类型通常是int
尽管可以显式定义。
由于枚举只是一个int
,当你声明一个没有初始值设定项的枚举时,不涉及默认构造函数;你只会得到一个未初始化的int
。
相关文章:
- 为什么我的开关/机箱在使用枚举时默认?
- 如何使用默认值将枚举声明为 extern
- 如何使用默认值为构造函数中的枚举赋值?
- 如何使用 pybind11 提供默认枚举值?
- 正向声明的枚举,默认值以.h为单位
- 枚举类默认整数值
- 为什么C++不为枚举类型提供默认"operator>>"函数?
- C++ 在C++中通过引用将枚举作为默认参数传递时出错
- 是否有C++准则将第一个枚举设置为"safe"默认值?
- 为什么作用域枚举默认支持运算符'<'?
- C++枚举的规范是默认可构造的
- 枚举类默认初始化
- 可以将枚举的默认类型设置为无符号字符
- 位掩码作为具有默认参数的成员枚举
- 未初始化的枚举器默认值
- C++中默认初始化的全局强类型枚举是什么
- OpenGL红皮书-如果枚举默认为整数,从0开始,glBindVertexArray如何绑定到保留值0
- 如何更改Boost.Serialization中的默认枚举序列化
- 在成员函数的默认参数中使用强类型枚举的成员
- 在类中声明的枚举的默认值