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

时间:2014-08-27 13:17:48

标签: 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;
}

什么是&#39; k&#39;初始化为?

2 个答案:

答案 0 :(得分:9)

k具有静态存储持续时间,静态对象初始化为零,我们可以通过转到draft C++ standard部分3.6.2 初始化非局部变量来看到这一点 2

  

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

对于标量类型,意味着初始化为零,这部分涵盖8.5 6 ,其中包含:

  

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

并包含以下项目符号:

  

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

获得

我们知道枚举是3.9 类型 9 中的标量类型,其中包含:

  

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

zero是一个有效值,因为基础类型可以包含其值,而7.2 枚举声明 8 表示枚举可以取一个未由其枚举器定义的值:

  

[...]可以定义一个值不是的枚举   由任何一名调查员定义。[...]

答案 1 :(得分:3)

初始化为零。考虑到这个枚举的底层类型是int(默认情况下),0是一个有效的枚举器,虽然它没有在枚举的任何枚举器定义中明确使用..

只有你必须写

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

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