c++ - 枚举类默认初始化
问题描述
枚举类的默认初始化/构造是否定义了行为?
这是一个最小的示例(在线尝试)
enum class ALPHA{
X = 0,
Y = 1,
Z = 2,
};
int main()
{
ALPHA a = ALPHA(); // use default constructor
ALPHA b{}; // use default initialization
std::cout <<static_cast<int>(a) << std::endl; // 0
std::cout <<static_cast<int>(b) << std::endl; // 0
return 0;
}
在这两种情况下我都得到零。那么默认初始化是否总是选择第一个枚举类型(例如这里 X = 0)?我知道它是标准枚举的 UB,但我不确定枚举类的语义?我也在CPPReference上查找了这个,但没有找到任何相关信息 - 是否也可以获得标准参考?
解决方案
[expr.type.conv]/1一个简单类型说明符(10.1.7.2) 或类型名称说明符(17.6) 后跟一个带括号的可选 *expression-list 或一个花括号初始化列表(初始化器)构造一个给定初始化器的指定类型的值。
[expr.type.conv]/2 ...否则,表达式是指定类型的纯右值,其结果对象使用初始化程序直接初始化(11.6)。
[dcl.init]/(17.4) — 如果初始化程序是
()
,则对象是值初始化的。
[dcl.init]/8对类型对象进行值初始化
T
意味着:(8.4) — 否则,对象被零初始化。
[dcl.init]/6对 T 类型的对象或引用进行零初始化意味着:
(6.1) — 如果
T
是标量类型 (6.9),则将对象初始化为通过将整数文字 0(零)转换为T
[basic.types]/9 ...枚举类型...统称为标量类型。
放在一起,ALPHA()
相当于static_cast<ALPHA>(0)
推荐阅读
- api - 有谁知道为什么我的云调试器 api 的延迟如此之高?
- c# - IHttpClientFactory 在 .NET Core 3.1 中因套接字异常而间歇性失败
- python - 从 HTML 中获取所有链接、URL 和 URI
- git - 如何无视。vs2019中使用GitHub时的vcxproj文件
- reactjs - CORS 策略已阻止从源“http://localhost:3000”访问“http://127.0.0.1:8000/server/api/auth/login”处的 XMLHttpRequest
- javascript - 在具有辅助功能的 JS 中设置焦点-voiceOver IOS
- python - “charmap”编解码器无法在位置 1 编码字符“\u0110”:字符映射到
使用 pd.read_csv 读取 csv 文件时 - python - JSON到带有嵌套列表的熊猫数据框
- c++ - 如何仅使用 c++ 中超过 2 名教师任期的 getter 来显示数据
- c# - 更改 .Net 5 项目 Sdk 的后果