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



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

#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;
}

"k"初始化为什么?

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

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

对于标量类型,意味着初始化为零,这在8.5节第6段中介绍,其中写道:

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

包括以下项目符号:

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

我们知道枚举是3.9Types9段中的标量类型,它说:

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

zero是一个有效值,因为基础类型可以包含其值,并且7.2枚举声明部分段落8表示枚举可以采用其枚举器未定义的值:

[…]可以定义一个值不是由其任何枚举器定义。[…]

初始化为零。请考虑此枚举的底层类型为int(默认情况下),0是有效的枚举器,尽管它没有明确用于枚举的任何枚举器定义中。。

只有你必须写

else if( k == static_cast<A>( 0 ) )
    cout<<"Equal to zero"<<endl;

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

最新更新