什么是在C++中默认初始化的全局强类型枚举?

joh*_*een 9 c++ enums initialization

我正在尝试确定初始化全局强类型枚举的默认值.以下代码当然不能编译.

#include <iostream>
using namespace std;

enum class A{a=10, b=20};

// Global strongly-typed enum, uninitialized
A k;

int main() {
    if(k==A::a)
        cout<<"Equal to a"<<endl;
    else if(k==A::b)
        cout<<"Equal to b"<<endl;
    else if(k==0)
        cout<<"Equal to zero"<<endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

什么是"k"初始化?

Sha*_*our 9

k有静态存储持续时间和静态对象零初始化,我们可以通过转到草案C++标准部分3.6.2 初始化非局部变量2段来看到这一点:

具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应在任何其他初始化发生之前进行零初始化(8.5).[...]

对于标量类型,这意味着初始化为零,这部分包含8.56节,其中说:

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

并包括以下项目:

如果T是标量类型(3.9),则将对象初始化为通过将整数0(零)转换为T获得的值; 105

我们知道一个枚举是一个标量类型,来自第9节的3.9 类型,它说:

算术类型(3.9.1),枚举类型,指针类型,指向成员类型的指针(3.9.2),std :: nullptr_- t和这些类型的cv限定版本(3.9.3)统称为标量类型. [...]

zero是一个有效的值,因为底层类型可以包含它的值和7.2 枚举声明段落8说明枚举可以采用一个未由其枚举器定义的值:

[...]可以定义一个枚举,该枚举的值不是由任何枚举器定义的.[...]


Vla*_*cow 3

它是零初始化的。请考虑到此枚举的底层类型是int(默认情况下),并且 0 是有效的枚举器,尽管它没有在枚举的任何枚举器定义中显式使用。

只有你必须写

else if( k == static_cast<A>( 0 ) )
    cout<<"Equal to zero"<<endl;
Run Code Online (Sandbox Code Playgroud)

如果您使用 C#,那么零可以隐式转换为任何类型的枚举。:)