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

constexpr函数内使用带mutable字段对象的合规性与编译器分歧问询

关于constexpr函数中使用带mutable字段对象的标准合规性问题

常量表达式无法访问可变子对象的规则,出自C++标准条款expr.const#4.8:

对象或引用若为……非可变子对象……则可在常量表达式中使用

Stack Overflow上有相关的优质讨论,近期版本的GCC与Clang均会正确拒绝对应的示例代码。但这里有个疑问:在constexpr函数中使用生命周期始于并终于函数内的带mutable字段的对象,是否存在限制?

参考如下示例代码:

struct S {    mutable int i = 2;};
auto f = []{
    constexpr S s;
    s.i = 3;
    return s.i;
};
// 所有编译器均通过
int x = f();
// GCC报错
constexpr int y = f();

在此示例中,Clang可成功完成y的初始化,但GCC会报错:

in 'constexpr' expansion of 'f.<lambda()>()'
error: mutable 'S::i' is not usable in a constant expression

这里的矛盾点在于:一方面代码确实使用了mutable子对象;但另一方面,该对象应当表现为普通非const对象,而这类对象在constexpr函数中是被允许的。请问哪个编译器的处理符合C++标准?

内容的提问来源于stack exchange,提问作者Fedor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:25:26