首页 > 解决方案 > 枚举类默认初始化

问题描述

枚举类的默认初始化/构造是否定义了行为?

这是一个最小的示例(在线尝试

enum class ALPHA{
    X = 0,
    Y = 1,
    Z = 2,
};

int main()
{
    ALPHA a = ALPHA(); // use default constructor
    ALPHA b{}; // use default initialization
    std::cout <<static_cast<int>(a) << std::endl; // 0
    std::cout <<static_cast<int>(b) << std::endl; // 0
    return 0;
}

在这两种情况下我都得到零。那么默认初始化是否总是选择第一个枚举类型(例如这里 X = 0)?我知道它是标准枚举的 UB,但我不确定枚举类的语义?我也在CPPReference上查找了这个,但没有找到任何相关信息 - 是否也可以获得标准参考?

标签: c++c++11

解决方案


[expr.type.conv]/1一个简单类型说明符(10.1.7.2) 或类型名称说明(17.6) 后跟一个带括号的可选 *expression-list 或一个花括号初始化列表(初始化器)构造一个给定初始化器的指定类型的值。

[expr.type.conv]/2 ...否则,表达式是指定类型的纯右值,其结果对象使用初始化程序直接初始化(11.6)。


[dcl.init]/(17.4) — 如果初始化程序是(),则对象是值初始化的。


[dcl.init]/8对类型对象进行值初始化T意味着:

(8.4) — 否则,对象被零初始化。


[dcl.init]/6对 T 类型的对象或引用进行零初始化意味着:

(6.1) — 如果T是标量类型 (6.9),则将对象初始化为通过将整数文字 0(零)转换为T


[basic.types]/9 ...枚举类型...统称为标量类型

放在一起,ALPHA()相当于static_cast<ALPHA>(0)


推荐阅读