GCC编译正常MSVC报C3615:constexpr构造函数无法生成常量表达式
GCC可编译但MSVC 2022报错C3615的原因分析
你的代码不符合C++20标准,MSVC的报错是正确的,GCC属于放宽了标准检查的非标准行为。
问题根源
在C++20的常量表达式规则中,不能直接用字符串字面量初始化非const的字符数组成员。字符串字面量是const char[N]类型,而你的fixSources是char[6](非const),这种初始化方式在常量表达式语境下是标准不允许的。GCC对该规则做了扩展支持,所以能编译通过,但这并非标准要求的行为。
修正方案
有两种合规的修改方式:
- 将数组改为const限定类型,符合常量表达式初始化要求:
struct GPSinfo_T { const char fixSources[6]; constexpr GPSinfo_T() : fixSources("NNNNN") {} };
- 保留非const数组,通过逐个字符初始化的方式实现:
struct GPSinfo_T { char fixSources[6]; constexpr GPSinfo_T() { const char src[] = "NNNNN"; for (int i = 0; i < 6; ++i) { fixSources[i] = src[i]; } } };
内容的提问来源于stack exchange,提问作者Dave Nadler
相关产品推荐
相关产品推荐

