含位域的struct的constexpr构造器GCC编译错误解决方法
解决GCC 9.2.0中constexpr构造函数初始化位域的错误
这个问题我之前排查过,本质是GCC 9.2.0对C++标准中constexpr构造函数的实现细节限制——你在构造函数体内的操作是赋值,而非标准要求的初始化,尤其是位域这类特殊成员,必须通过成员初始化列表完成初始化,才能被编译器识别为合法的编译期操作。
错误原因拆解
在C++17及更早的标准中,constexpr构造函数要求所有非静态数据成员必须在编译期完成初始化。构造函数体内的赋值操作,对于普通成员可能有宽松空间,但位域的内存布局有特殊性,GCC 9.2.0的实现会严格要求必须用成员初始化列表来完成初始化,函数体内的赋值无法被编译器判定为合法的编译期初始化步骤。
修复后的代码
把构造函数改成用成员初始化列表初始化位域成员即可:
struct data { uint8_t nibble1 : 4, nibble2 : 4; constexpr data() : nibble1(2), nibble2(4) {} };
额外说明
C20放宽了constexpr构造函数的限制,允许在函数体内对位域进行赋值,但GCC 9.2.0并不支持C20的这个规则。如果要兼容这个版本的编译器,使用成员初始化列表是最稳妥的方案。
内容的提问来源于stack exchange,提问作者konsolas
相关产品推荐
相关产品推荐

