C++20奇怪的返回值要求表达式

7
考虑requires表达式:
constexpr auto b = requires { []{}; };

GCC pass了以下两个static_assert

 static_assert(b);
 static_assert(!b); 

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


肯定看起来像某种错误。如果我们明确将b声明为布尔值,情况会变得更奇怪。https://godbolt.org/z/1ebTP6 - StoryTeller - Unslander Monica
除非代码存在格式错误,否则我会说这是gcc的bug,clang/msvc会拒绝它演示 - Jarod42
@StoryTeller-UnslanderMonica。好的,那我在这里报告它(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99546)。 - 康桓瑋
1
@Jarod42。这段代码形式良好。Clang没有实现 P0315R4,这是一个 MSVC Bug。 - 康桓瑋
说实话,这是另一种奇怪的变形:https://godbolt.org/z/bbKTnh - 463035818_is_not_a_number
1个回答

3
这不是薛定谔的需求: b 应明确为 truefalse
这里的需求是:
constexpr auto b = requires { []{}; };

这只是一个简单需求,我们只是在检查表达式 []{}是否有效。结果证明是有效的!所以b应该是true。这是GCC的一个bug(而且StoryTeller的例子表明,在稍微不同的拼写方式下,b甚至不能算作常量表达式)。


1
我真的很喜欢Schrödinger这部分。 - 康桓瑋

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接