【问题标题】:std::optional assignment operator in a constexpr contextconstexpr 上下文中的 std::optional 赋值运算符
【发布时间】:2018-08-19 19:09:40
【问题描述】:

我对@9​​87654324@ 摸不着头脑,根据the docs,它不应该有constexpr 赋值运算符。

但是,当我在 gcc-8.1 中尝试这个 sn-p 时,它编译并工作得很好:

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

constexpr auto z = foo();

我有什么遗漏吗?

【问题讨论】:

  • constexpr auto z = foo() 也编译吗?
  • @Evgeny 是的,确实如此,它在更复杂的环境中工作......
  • @Evgeny 是的,直播:godbolt.org/z/Y11f6k
  • P0602。它还没有应用于标准,但是当它被应用时,它会赋值constexpr。 (并且预计将追溯适用于 C++17。)
  • @cpplearner 啊,这解释了很多!请把它作为答案发布,我会接受它,因为这是正确的。

标签: c++ c++17 optional constexpr libstdc++


【解决方案1】:

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

Link to the bug report


编辑:

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

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

没错,但标准被打破了。

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

事实上,P0602R3 提议是相关的,因为它会要求实现将运算符定义为默认值(为了简单起见),因此编译器总是会将其设为 constexpr标准::可选。

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

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

【讨论】:

  • 不,clang-6.0 也不会失败:wandbox.org/permlink/o7gn4bGMdazVGqUB
  • VS2017 也没有
  • @AndriyTylychko 这更奇怪,因为它失败了:gcc.godbolt.org/z/2u3u3M
  • @AndriyTylychko 我不确定,我试过用-std=c++17 -Wall -Wextra -pedantic -O0 -g -fno-elide-constructors编译,编译还是成功的。
  • 我发布了错误报告,我们将看看开发人员对此有何评论。
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
相关资源
最近更新 更多