C ++枚举类型似乎是“默认可构造的”:
enum UE { a=1, b, c };
enum class SE { a=1, b, c };
int main() {
UE ue;
SE se;
}
如何从标准中对此进行解释?
我的意思是-假设我们要更改标准以使其成为标准,这样它们就不能默认构造。哪些条款会更改?
答案 0 :(得分:7)
全部在[dcl.init]/7中:
默认初始化T类型的对象的意思是:
如果T是(可能是cv限定的)类类型,则考虑构造函数。列举适用的构造函数 ([over.match.ctor]),并选择最佳的初始化方法() 通过重载决议。这样选择的构造函数称为, 带有一个空的参数列表,以初始化对象。
如果T是数组类型,则每个元素都将默认初始化。
否则,不执行初始化。
UE
和SE
匹配第三个项目符号,就像基本类型一样。因此,初始化只是一个空操作,而它们具有不确定的值。
这也是您需要首先解决的项目符号列表,以使枚举无法默认初始化。
答案 1 :(得分:2)
不要让class
中的enum class
混淆您:它仍然被认为是非类类型。 作用域枚举的语法恰好是选择class
关键字,以免在该语言中添加另一个保留字。
答案 2 :(得分:1)
此处有一个规范草案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4778.pdf
请参见9.6节,枚举声明。
我认为您可能来自Java,枚举是类。在C ++中,枚举值只是整数常量。常量的类型通常为int
,尽管可以显式定义。
由于枚举只是一个int
,因此当您声明一个没有初始化程序的变量时,就不会涉及默认的构造函数;您只会得到未初始化的int
。