我正在尝试确定全局强类型枚举初始化为的默认值。以下代码当然不会编译。
#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.9
Types第9段中的标量类型,它说:
算术类型(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#,那么零可以隐式转换为任何类型的枚举。:)