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

问题描述 投票:0回答:1
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构造函数无法满足的任何要求。

如何摆脱这个错误?

c++ constructor c++17 constexpr bit-fields
1个回答
3
投票

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

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

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

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

但是这个:

nibble1 = 2;

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

© www.soinside.com 2019 - 2024. All rights reserved.