首先,根据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的枚举量,那么对枚举进行值初始化(如果可能的话)实际上可能会导致未定义的行为?
根据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的枚举量,那么对枚举进行值初始化(如果可能的话)实际上可能会导致未定义的行为?
T
是标量类型(3.9),则对象将被初始化为将整数字面值0
(零)转换为T
所得到的值”。请注意缺少“隐式”的字眼。@Cubbi对于static_cast
的修复仍然是错误的;当前的描述仅适用于底层类型不固定的枚举型。根据[dcl.enum]/8,“对于底层类型固定的枚举型,枚举的值为其底层类型的值。” - T.C.