【发布时间】:2019-01-30 01:10:54
【问题描述】:
问题在下面的代码中,询问使用所示的值初始化语法是否意味着对各个位域成员进行零初始化或未初始化:
struct S { // S is POD
int a : 3;
int b : 1;
};
S s1;
S s2{};
s1.a; // uninitialized (ok, we understand this)
s1.b; // "
s2.a; // zero or junk?
s2.b; // "
这里是位域的复习:https://en.cppreference.com/w/cpp/language/bit_field
为具有许多位字段的结构创建归零构造函数通常是使用遗留代码中的丑陋 memset 完成的,因为在构造函数初始化列表中使用 value-init 语法重复每个位字段成员的名称会产生难以管理的代码。即使结构是一个很好的衡量标准,也会这样做。如果可能的话,想在 C++11 中消除这种情况(不幸的是,直到 C++20 之前,默认成员初始化语法才可用于位字段)。 C++11 是否保证使用 {}-init 语法对此进行零初始化?
【问题讨论】:
-
收回唯一有用的评论,来自 NathanOliver:一半的答案是here。
-
@SergeyA 如果多个编译器具有相同的特定行为,那么标准通常会保证这一点。这允许乐于助人的语言律师首先开始寻找保证行为的规则。这类似于分支预测。如果存在具有冲突行为的编译器,则帮助程序可以从不保证行为的猜测开始。在这种情况下,如果助手确实找到了保证一种行为的规则,那么助手就会知道值得考虑他们是否在解释一个模棱两可的规则。
标签: c++ c++11 initialization language-lawyer bit-fields