在 constexpr 函数中使用具有可变字段的对象

Using objects with mutable fields inside constexpr functions

提问人:Fedor 提问时间:7/4/2023 更新时间:7/4/2023 访问量:68

问:

常量表达式无法访问可变子对象。这是在 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

一方面,确实使用了子对象。但另一方面,它应该表现为正常的非常量对象,这在函数内部是允许的。mutableconstexpr

哪个编译器就在这里?

C++(英语:C++) 语言律师 康斯特克普尔 可变

评论


答: 暂无答案