You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:50:00