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

时间:2019-01-27 14:30:48

标签: c++ language-lawyer c++17

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

enum UE { a=1, b, c };
enum class SE { a=1, b, c };

int main() {
    UE ue;
    SE se;
}

如何从标准中对此进行解释?

我的意思是-假设我们要更改标准以使其成为标准,这样它们就不能默认构造。哪些条款会更改?

3 个答案:

答案 0 :(得分:7)

全部在[dcl.init]/7中:

  

默认初始化T类型的对象的意思是:

     
      
  • 如果T是(可能是cv限定的)类类型,则考虑构造函数。列举适用的构造函数   ([over.match.ctor]),并选择最佳的初始化方法()   通过重载决议。这样选择的构造函数称为,   带有一个空的参数列表,以初始化对象。

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

  •   
  • 否则,不执行初始化。

  •   

UESE匹配第三个项目符号,就像基本类型一样。因此,初始化只是一个空操作,而它们具有不确定的值。

这也是您需要首先解决的项目符号列表,以使枚举无法默认初始化。

答案 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