初始化枚举的值的行为

Lin*_*gxi 33 c++ enums initialization language-lawyer value-initialization

首先,我想说,根据cppreference.com,对枚举值进行初始化是不可能的.

根据http://en.cppreference.com/w/cpp/language/value_initialization,初始化枚举值实际上执行零初始化.然后,根据http://en.cppreference.com/w/cpp/language/zero_initialization,零初始化枚举的效果是:

如果T是标量类型,则对象的初始值是隐式转换为的整数常量零T.

但是,整数常数零不能隐式转换为枚举.最终,枚举不能进行价值初始化.这听起来很奇怪,并且枚举值的初始值确实适用于VC,GCC和clang.那么,标准对此有何看法?

其次,根据http://en.cppreference.com/w/cpp/language/static_cast:

整数,浮点或枚举类型可以转换为任何完整的枚举类型(结果是未指定的(直到C++ 17)未定义的行为(自C++ 17)如果表达式的值转换为枚举的基础类型,不是目标枚举值之一)

那么,这是否意味着如果目标枚举没有枚举器等于,则初始化枚举值(如果它可以工作)可能实际上导致未定义的行为0

小智 4

1:这可以这样理解:

enum class SomeEnum : int { V1 = 0, V2 = 1, V3 = 2 }; 
SomeEnum a = 0; // compile error
SomeEnum b = SomeEnum.V1; // OK
Run Code Online (Sandbox Code Playgroud)

这是针对未定义行为的基本保护!

2:是的,是的:)

SomeEnum c = static_cast<SomeEnum>(1); // = SomeEnum.V2
SomeEnum d = static_cast<SomeEnum>(5); // undefined behavior
Run Code Online (Sandbox Code Playgroud)

static_cast 从定义上来说是危险的,它只能用于支持序列化或旧的 C 接口!

  • `static_cast&lt;SomeEnum&gt;(5);` 不是 UB。`5` 是枚举可表示的值;您甚至明确声明基础类型是“int”。请参阅:[如果将无效值 static_cast 到枚举类会发生什么?](http://stackoverflow.com/q/18195312) (3认同)
  • 不,该语言精确地指定了 `static_cast&lt;SomeEnum&gt;(5)` 的行为。您或任何就此而言的程序员可能不会期望枚举类型的变量与该枚举的所有枚举器进行比较时不相等,但该语言不提供任何此类保证。在没有相应枚举器的情况下使用枚举值的一种方法是转换为基础类型,即“static_cast&lt;int&gt;(static_cast&lt;SomeEnum&gt;(x)) == x”对于所有可以表示为鉴于“int”是“SomeEnum”的基础类型,“int”(语言保证了这一点)。 (3认同)