我试图确定全局强类型枚举初始化的默认值。下面的代码当然不能编译。
#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++ 标准草案 https://github.com/cplusplus/draft/blob/b7b8ed08ba4c111ad03e13e8524a1b746cb74ec6/papers/N3936.pdf部分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表示枚举可以采用其枚举器未定义的值:
[...]可以定义一个不具有值的枚举
由其任何枚举器定义。[...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)