繁体   English   中英

具有位域的结构的 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 构造函数不满足的任何要求。

我怎样才能摆脱这个错误?

您需要使用成员初始化列表来初始化成员:

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

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

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

但是这个:

nibble1 = 2;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM