【发布时间】:2015-01-14 02:42:07
【问题描述】:
首先,我想说,根据 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:
如果将表达式的值转换为枚举的底层类型,不是目标枚举值之一)
那么,这是否意味着如果目标枚举没有等于 0 的枚举数,则对枚举进行值初始化(如果它确实有效)实际上可能会导致未定义的行为?
【问题讨论】:
-
回复:第二。这不是标准所说的。从 C++14:“5.2.9/10 整数或枚举类型的值可以显式转换为枚举类型。如果原始值在 范围内,则该值不变枚举值 (7.2)。否则,结果值未指定(并且可能不在该范围内)。强调我的。枚举值的范围(由 7.2/8 定义)使得 0 始终落入其中。
-
@IgorTandetnik cppreference 已更新
-
零初始化的描述也是错误的。 [dcl.init]/6.1 表示“如果
T是标量类型(3.9),则将对象初始化为通过将整数文字0(零)转换为T获得的值”。注意缺少“隐式”。 @Cubbistatic_cast的修复仍然关闭;当前描述仅适用于基础类型不固定的枚举。 Per [dcl.enum]/8, “对于基础类型固定的枚举,枚举的值就是基础类型的值。” -
@T.C.已编辑,谢谢!不要犹豫,自己更正任何内容,它是公开可编辑的。
标签: c++ enums initialization language-lawyer value-initialization