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 报告此错误。
编辑:
原来这不是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 中阅读更多相关信息。
我对 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 报告此错误。
编辑:
原来这不是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 中阅读更多相关信息。