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
相关产品推荐
相关产品推荐

