GCC 14.2中constexpr string加法创建后无法用于常量表达式问题
GCC 14.2(C++23)中constexpr std::string的编译差异问题
在GCC 14.2启用-std=gnu++23标准的环境下,constexpr std::string存在以下编译行为差异:
直接通过字符串加法操作(如std::string("a") + "b")创建的static constexpr std::string,无法赋值给另一个static constexpr std::string——即便字符串长度符合GCC对constexpr string的15字符限制。
但通过以下三种方式创建的constexpr std::string,均可正常赋值给其他static constexpr std::string:
- 字符串字面量隐式转换:
std::string A = "ab" - 显式构造:
std::string B = std::string("ab") - 在constexpr函数内执行加法操作后返回
示例代码
#include <iostream> #include <string> static constexpr std::string A = "ab"; static constexpr std::string _A = A; // 编译通过 static constexpr std::string B = std::string("ab"); static constexpr std::string _B = B; // 编译通过 static constexpr std::string C() { return std::string("a") + "b"; } static constexpr std::string _C = C(); // 编译通过 static constexpr std::string D = std::string("a") + "b"; static constexpr std::string _D = D; // 错误:‘D’的值无法用于常量表达式 int main() { std::cout << _A << std::endl << _B << std::endl << _C << std::endl << _D << std::endl; }
编译结果说明
A与_A:编译通过,隐式转换得到的constexpr string可正常赋值B与_B:编译通过,显式构造的constexpr string可正常赋值C()与_C:编译通过,constexpr函数内执行加法得到的结果可正常赋值D与_D:编译失败,直接通过加法创建的constexpr string无法作为常量表达式赋值给另一个constexpr string
内容的提问来源于stack exchange,提问作者Gunnar Knutson
相关产品推荐
相关产品推荐

