代码之家  ›  专栏  ›  技术社区  ›  tangy

枚举类默认初始化

  •  4
  • tangy  · 技术社区  · 7 年前

    这里有一个最小的例子( Try Online

    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 也有,但没有找到任何相关信息-有可能获得标准参考吗?

    2 回复  |  直到 7 年前
        1
  •  5
  •   Igor Tandetnik    7 年前

    A. 简单类型说明符 类型名说明符 大括号初始化列表

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


    如果初始值设定项为 () ,则对象的值已初始化。


    值初始化 T


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

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


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

    加起来,, ALPHA() 相当于 static_cast<ALPHA>(0)

        2
  •  3
  •   Community Mohan Dere    6 年前

    初始值设定项列表 包含单个元素,不涉及缩小转换。

    [dcl.enum]/8

    可以定义一个枚举,该枚举的值不是由其任何枚举数定义的。

    [dcl.init]/6.1

    将类型为T的对象或引用初始化为零意味着:

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

    在您的示例中,零初始化初始化 a b 0 它们对应于枚举数 X