当前位置: 首页 > 知识库问答 >
问题:

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

阚小云
2023-03-14

根据cppreference,gcc和clang最近都完成了P1102R2(“make()more optional for lambda”)的实现,这意味着我们可以在C++23中更简洁地定义lambda表达式。

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

auto l = []<auto> noexcept requires true {};

clang接受这种形式,而gcc拒绝它的语法。

我应该信任哪个编译器?这个lambda在C++23中是格式正确还是格式错误?

共有1个答案

汪德明
2023-03-14

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

正确的答案是:不,那不是一个格式良好的lambda。语法在[expr.prim.lambda.general]中定义:

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

[]<auto> noexcept requires true {};
  • []是lambda-introducer
  • 匹配 ,现在我们知道我们是第二种lambda-expression。因此,从语法上讲,我们需要在后面加上requires-clause(可选),然后是lambda-declarator,然后是component-statement。
  • noexcept与requires-clause不匹配,所以现在我们解析lambda-declarator。lambda-declarator可以以(parameter-declarathtml" target="_blank">ion-clause)开头,但我们没有这个功能,所以我们只是在寻找lambda-specifier。我们使用noexcept作为noexcept-specifier的一部分。
  • requires true既不适合attribute-specifier-seq也不适合trailling-return-type,所以这两个都不适合,现在我们已经处理了lambda-specifier,所以我们也处理了lambda-declarator。在这一点上,我们正在寻找一个复合语句。但我们没有,所以这是一个错误。

基本上,您可以在两个位置放置requires-clause:或者直接放在模板参数之后,或者(如果我们有函数参数)放在函数参数之后的lambda-specifiers之后。所以这是可行的:

[]<auto> requires true noexcept {};

与此相同的是:

[]<auto>() noexcept requires true {};

与此相同的是:

[]<auto> requires true () noexcept requires true { };

但不是行动中的那个。

还有,不要写这个。

 类似资料:
  • 在很多资料中,经常会看到这样一句话:“Python 中的函数是第一类对象”。关于这一点,Python 的创始人 Guido 曾提过 “First-class Everything”,他对 Python 的一个发展目标就是所有的对象都是第一类对象。 1. 将函数作为第一类对象 1.1 什么是第一类对象 在前言中所说的第一类对象,其实是指函数作为一个对象,与其它对象具有相同的地位。具体来说,数值可以被

  • 本文向大家介绍C++ 参数省略,包括了C++ 参数省略的使用技巧和注意事项,需要的朋友参考一下 示例 当将参数传递给函数时,参数是函数参数类型的prvalue表达式,而该类型不是引用,则可以忽略prvalue的构造。 这表示要创建一个临时文件string,然后将其移动到function参数中str。复制省略允许该表达式直接在中创建对象str,而不是使用临时+移动。 这对于声明构造函数的情况非常有用

  • 我正在尝试在Java中使用Lambda表达式来理解以下方法参考代码: 我的问题是,为什么函数sameTemp只有一个参数?接口声明它必须有2个参数,所以对我来说没有意义。也许hTemp实例变量对这两个都足够了?我从Java完整参考书中获得了这一点,作者在那里解释了这一点: 块引用 在程序中,请注意HighTemp有两个实例方法:

  • 问题内容: 我正在使用EclipseLink(2.5.1,也尝试过2.5.2-M1)构建一个Java SE 8(oracle 1.8.0-b129)应用程序,并且拥有一个Entity类,尽管已正确注释和删除,但EclipeLink只是忽略了它在persistence.xml文件中引用。日志中没有提及该类,没有为它生成任何模式,等等。使用该实体将给出“抽象模式类型未知”错误。 我想我终于找到了原因,

  • 问题内容: 我试图通过使用Runnable接口包装我需要的任何函数来简单地计时一个函数。 那么我可以简单地执行以下操作: 但是,如果我有一个带有参数的函数,则必须将其修改为: 我遇到的问题是’someParameter’必须是final或有效的final。有没有解决此问题的方法?我见过forEach的循环,但是我需要将此参数从1、10、100->指数化直到满足条件。代码是这样的: 我要求funct

  • (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂