具有位域的结构的 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 之前,这对于位域是不可能的)。