std::optional constexpr 上下文中的赋值运算符

std::optional assignment operator in a constexpr context

我对 std::optional 摸不着头脑,根据 the docs,它不应该有 constexpr 赋值运算符。

然而,当我在 gcc-8.1 中尝试这个片段时,它编译并工作得很好:

constexpr std::optional<int> foo() {
    std::optional<int> bar = 3;
    bar = 1337;
    return bar;
}

constexpr auto z = foo();

有什么我遗漏的吗?

这似乎是 gcc 中的一个错误。我刚刚在 clang-6.0 中尝试过,编译失败并出现预期错误。此外,该标准没有提及赋值运算符的任何 constexpr 重载,因此我将向 gcc bugtracker 报告此错误。

Link to the bug report


编辑:

原来这不是gcc的bug,而是标准的错误:

I don't understand how the code snippet can work in a constexpr context when the current c++17 standard doesn't specify any constexpr assignment operator.

没错,但标准被打破了。

所有实现都将赋值运算符定义为默认值,因此编译器将其设为 constexpr。

事实上 P0602R3 提案是相关的,因为它将 要求 实现将运算符定义为默认值(为了简单),因此编译器是总是要让它成为 std::optional.

的 constexpr

我已经向标准委员会提出了这个问题。

您可以在 the bug report 中阅读更多相关信息。