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 接口!