首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++23中省略参数表的lambda表达式的有效性

C++23中省略参数表的lambda表达式的有效性
EN

Stack Overflow用户
提问于 2021-03-27 16:02:23
回答 1查看 1.8K关注 0票数 32

根据优先选择的说法,gcc和clang都已经完成了P1102R2的实现(“倒()!")最近,这意味着我们可以在C++23中更简洁地定义lambda表达式。

但我发现它们与某种形式不一致:

代码语言:javascript
复制
auto l = []<auto> noexcept requires true {};

clang接受这种形式,gcc 废品它的语法。

我应该信任哪个编译器?在C++23中,这个蓝宝石是成形良好还是变形不良?

更新:

也许是因为舆论的压力,在我报告49736后的五天内,clang很快就把它修好了。

当我进一步尝试的时候,我意外地发现gcc也拒绝了以下的有效表格,这让我报告了99850,并在两周后修复了。

代码语言:javascript
复制
auto l = []<auto> requires true -> void {};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-27 16:20:05

谢谢你提醒我这个特性是多么的毫无意义。

正确的答案是:不,这不是一个结构良好的羔羊。语法在[expr.prim.lambda.general]中定义

在我们的例子中,首先我们有:

代码语言:javascript
复制
[]<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-说明符之后。因此,这是可行的:

代码语言:javascript
复制
[]<auto> requires true noexcept {};

这一点也是如此:

代码语言:javascript
复制
[]<auto>() noexcept requires true {};

这一点也是如此:

代码语言:javascript
复制
[]<auto> requires true () noexcept requires true { };

但不是行动组的那个。

还有,别写这个。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66833334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档