具有位域的结构的Constexpr构造函数

时间:2019-12-30 15:14:39

标签: c++ constructor c++17 constexpr bit-fields

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构造函数无法满足的任何要求。

如何摆脱这个错误?

1 个答案:

答案 0 :(得分:3)

您需要使用member initializer list初始化成员:

constexpr data() : nibble1(2), nibble2(4) { }

您链接的页面显示了constexpr构造函数的以下要求:

  
      
  • 对于类或结构的构造函数,必须初始化每个基类子对象和每个非变量非静态数据成员。
  •   

但这是

nibble1 = 2;

...不是nibble1的初始化,而是一个赋值。初始化成员变量的唯一方法是使用成员初始值设定项列表或将其默认设置(我认为在C ++ 20之前,这对于位域是不可能的。)

相关问题