【问题标题】:Weird return value of C++20 requires expressionC++20的奇怪返回值需要表达式
【发布时间】:2021-06-09 05:38:54
【问题描述】:

考虑 requires 表达式

constexpr auto b = requires { []{}; };

GCCpass以下两个static_assert

 static_assert(b);
 static_assert(!b); 

这看起来非常奇怪。我希望b 的值应该是true。这只是一个 GCC 错误吗?

【问题讨论】:

  • 绝对看起来像是某种错误。如果我们将b 明确声明为布尔值godbolt.org/z/1ebTP6,那就更奇怪了
  • 除非代码是格式错误的 NDR,否则我会说 gcc 错误,clang/msvc 拒绝它Demo
  • @StoryTeller-UnslanderMonica。好的,那我报告它here
  • @Jarod42。这段代码格式正确。 Clang 没有实现P0315R4,这是一个 MSVC 错误。
  • fwiw,怪异的不同化身:godbolt.org/z/bbKTnh

标签: c++ lambda c++20 c++-concepts


【解决方案1】:

这不是薛定谔的要求:b 显然应该是 truefalse

这里的要求:

constexpr auto b = requires { []{}; };

是一个简单的要求。我们只是检查 表达式 []{} 是否是一个有效的表达式。而且……是的!所以b 应该是真的。这是一个 gcc 错误(StoryTeller's example 更是如此,这表明在拼写略有不同时 b 甚至不算作常量表达式)。

【讨论】:

  • 我真的很喜欢薛定谔的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多