枚举类默认初始化

2024-05-15

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

这是一个最小的例子(在线尝试 https://coliru.stacked-crooked.com/a/d3091f82e33f5b42)

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,但我不确定枚举类的语义?我查了一下CPP参考 https://en.cppreference.com/w/cpp/language/enum也没有找到任何相关信息 - 是否也可以获得标准参考?


[表达式.类型.转换]/1 A 简单类型说明符(10.1.7.2) 或类型名称说明符(17.6) 后跟带括号的可选*表达式列表或大括号初始化列表(初始化器)在给定初始化器的情况下构造指定类型的值。

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


[dcl.init]/(17.4)— 如果初始化器是(),该对象已被值初始化。


[dcl.init]/8 To 值初始化类型的对象T means:

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


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

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


[基本类型]/9...枚举类型...统称为标量类型.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

枚举类默认初始化 的相关文章

随机推荐