根据优先选择的说法,gcc和clang都已经完成了P1102R2的实现(“倒()!")最近,这意味着我们可以在C++23中更简洁地定义lambda表达式。
但我发现它们与某种形式不一致:
auto l = []<auto> noexcept requires true {};clang接受这种形式,gcc 废品它的语法。
我应该信任哪个编译器?在C++23中,这个蓝宝石是成形良好还是变形不良?
更新:
也许是因为舆论的压力,在我报告49736后的五天内,clang很快就把它修好了。
当我进一步尝试的时候,我意外地发现gcc也拒绝了以下的有效表格,这让我报告了99850,并在两周后修复了。
auto l = []<auto> requires true -> void {};发布于 2021-03-27 16:20:05
谢谢你提醒我这个特性是多么的毫无意义。
正确的答案是:不,这不是一个结构良好的羔羊。语法在[expr.prim.lambda.general]中定义

在我们的例子中,首先我们有:
[]<auto> noexcept requires true {};[]是兰达的引导者<auto>和<template-parameter-list>匹配,现在我们知道我们是第二种lambda表达式。因此,在语法上,我们需要后面跟着一个Require-子句(可选),然后是lambda-声明符,然后是一个复合语句。noexcept不匹配requires子句,所以现在我们解析一个lambda声明器。一个lambda声明器可以从(parameter-declaration-clause)开始,但是我们没有它,所以我们只是在寻找lambda说明符。我们使用noexcept作为no以外说明符的一部分。requires true既不适合属性说明符-seq,也不适合尾随-返回类型,因此我们没有这两种类型,现在我们已经完成了lambda-说明符,所以我们完成了lambda-声明器。在这一点上,我们正在寻找一个复合声明。但我们没有,所以这是个错误。基本上,有两个点您可以放置一个requires子句:或者直接在模板参数之后,或者,如果我们有函数参数,则放在函数参数之后的lambda-说明符之后。因此,这是可行的:
[]<auto> requires true noexcept {};这一点也是如此:
[]<auto>() noexcept requires true {};这一点也是如此:
[]<auto> requires true () noexcept requires true { };但不是行动组的那个。
还有,别写这个。
https://stackoverflow.com/questions/66833334
复制相似问题