我在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中的一个bug。我刚刚尝试使用clang-6.0,编译失败并出现预期的错误。此外,标准没有提到赋值运算符的任何constexpr
重载,因此我将向gcc bugtracker报告此错误。
编辑:
事实证明,这不是gcc中的错误,而是标准中的错误:
当当前的c ++ 17标准没有指定任何constexpr赋值运算符时,我不明白代码片段如何在constexpr上下文中工作。
这是真的,但标准被打破了。
所有实现都将赋值运算符定义为默认值,因此编译器使其成为constexpr。
事实上,P0602R3提议是相关的,因为它需要实现来将运算符定义为默认的(为了是微不足道的),因此编译器总是将其作为constexpr用于std :: optional。
我已经和标准委员会提出了这个问题。
你可以在the bug report上阅读更多相关信息。