具有位域的结构的 Constexpr 构造函数
Constexpr constructor for a struct with bitfields
struct data {
uint8_t nibble1 : 4,
nibble2 : 4;
constexpr data() {
nibble1 = 2;
nibble2 = 4;
}
};
这让我在 GCC 9.2.0 上出现以下两个编译错误:
error: member 'data::nibble1' must be initialized by mem-initializer in 'constexpr' constructor
error: member 'data::nibble2' must be initialized by mem-initializer in 'constexpr' constructor
但我很确定我的构造函数对它们都进行了初始化。我查看了 https://en.cppreference.com/w/cpp/language/constexpr,没有发现我的 constexpr 构造函数不满足的任何要求。
我怎样才能摆脱这个错误?
您需要使用 member initializer list:
初始化成员
constexpr data() : nibble1(2), nibble2(4) { }
您链接的页面显示了 constexpr
构造函数的以下要求:
- for the constructor of a class or struct, every base class sub-object and every non-variant non-static data member must be initialized.
但是这个:
nibble1 = 2;
...不是 nibble1
的初始化,它是一个赋值。初始化成员变量的唯一方法是使用成员初始化列表或默认它们(我认为在 C++20 之前,这对于位域是不可能的)。
struct data {
uint8_t nibble1 : 4,
nibble2 : 4;
constexpr data() {
nibble1 = 2;
nibble2 = 4;
}
};
这让我在 GCC 9.2.0 上出现以下两个编译错误:
error: member 'data::nibble1' must be initialized by mem-initializer in 'constexpr' constructor
error: member 'data::nibble2' must be initialized by mem-initializer in 'constexpr' constructor
但我很确定我的构造函数对它们都进行了初始化。我查看了 https://en.cppreference.com/w/cpp/language/constexpr,没有发现我的 constexpr 构造函数不满足的任何要求。
我怎样才能摆脱这个错误?
您需要使用 member initializer list:
初始化成员constexpr data() : nibble1(2), nibble2(4) { }
您链接的页面显示了 constexpr
构造函数的以下要求:
- for the constructor of a class or struct, every base class sub-object and every non-variant non-static data member must be initialized.
但是这个:
nibble1 = 2;
...不是 nibble1
的初始化,它是一个赋值。初始化成员变量的唯一方法是使用成员初始化列表或默认它们(我认为在 C++20 之前,这对于位域是不可能的)。