提问人:Fedor 提问时间:7/4/2023 更新时间:7/4/2023 访问量:68
在 constexpr 函数中使用具有可变字段的对象
Using objects with mutable fields inside constexpr functions
问:
常量表达式无法访问可变子对象。这是在 expr.const#4.8 中
一个对象或引用在常量表达式中可用,如果它是......一个不可变的子对象......
关于它有一个很好的问题。(最近的 GCC 和 Clang 都正确地拒绝了那里的例子)。
但是,在函数中使用具有可变字段的对象(包括开始和结束其生存期)是否有任何限制?请看这个例子:constexpr
struct S {
mutable int i = 2;
};
auto f = []{
constexpr S s;
s.i = 3;
return s.i;
};
// ok everywhere
int x = f();
// error in GCC
constexpr int y = f();
这里的初始化在 Clang 中成功,但在 GCC 中失败并显示错误:y
in 'constexpr' expansion of 'f.<lambda()>()'
error: mutable 'S::i' is not usable in a constant expression
在线演示:https://gcc.godbolt.org/z/qbfY6jfbe
一方面,确实使用了子对象。但另一方面,它应该表现为正常的非常量对象,这在函数内部是允许的。mutable
constexpr
哪个编译器就在这里?
答: 暂无答案
评论