C++20:用string literal初始化char数组成员是否为constexpr?
问题分析与结论
根据C++20标准,GCC和Clang的行为是正确的,MSVC存在编译器实现错误。
具体依据如下:
- 隐式默认构造函数的constexpr属性规则:
按照C++20标准[class.default.ctor]条款,隐式生成的默认构造函数会自动成为constexpr构造函数,只要它的所有子对象初始化操作都满足常量表达式的要求。 - 字符串字面量初始化char数组的合法性:
用字符串字面量"1"初始化char str[2]属于合法的常量表达式操作——字符串字面量是静态存储期的常量,初始化数组时会将字面量的字符(包括末尾的'\0')依次赋值给数组元素,整个过程完全符合常量表达式的要求。 - MSVC的错误点:
MSVC错误地判定这种字符串字面量初始化会导致隐式默认构造函数失去constexpr属性,但实际上该初始化操作完全满足constexpr构造函数的要求,因此constexpr S s;和constexpr S s2{}都应该被允许编译。
补充验证:当使用聚合初始化constexpr S s2{}或用字符字面量列表{'a', '\0'}初始化数组时,MSVC能正确编译,这也侧面说明MSVC只是在处理字符串字面量作为成员初始化器时,对隐式默认构造函数的constexpr判定出现了偏差。
内容的提问来源于stack exchange,提问作者fabian
相关产品推荐
相关产品推荐

