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

问题描述 投票:9回答:1

我在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();

有什么我想念的吗?

c++ c++17 optional constexpr libstdc++
1个回答
5
投票

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

Link to the bug report


编辑:

事实证明,这不是gcc中的错误,而是标准中的错误:

当当前的c ++ 17标准没有指定任何constexpr赋值运算符时,我不明白代码片段如何在constexpr上下文中工作。

这是真的,但标准被打破了。

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

事实上,P0602R3提议是相关的,因为它需要实现来将运算符定义为默认的(为了是微不足道的),因此编译器总是将其作为constexpr用于std :: optional。

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

你可以在the bug report上阅读更多相关信息。

© www.soinside.com 2019 - 2024. All rights reserved.