感谢您提醒我这个功能是多么无意义。
正确答案是:不,这不是一个格式良好的 lambda。语法在[expr.prim.lambda.general]中定义:
在我们的例子中,首先我们有:
[]<auto> noexcept requires true {};
[]
是lambda-introducer
<auto>
匹配<template-parameter-list>
,现在我们知道我们是第二种lambda-expression。所以从语法上讲,我们需要跟随一个requires-clause(可选),然后是一个lambda-declarator,然后是一个复合语句。
noexcept
不匹配requires-clause,所以现在我们正在解析一个lambda-declarator。一个lambda-declarator可以开始,(parameter-declaration-clause)
但我们没有,所以我们只是在寻找lambda-specifiers。我们将noexcept
用作noexcept-specifier的一部分。
requires true
不适合attribute-specifier-seq或trailing-return-type所以我们都没有,现在我们完成了lambda-specifiers所以我们完成了lambda-declarator。此时,我们正在寻找一个复合语句。但是我们没有那个,所以这是一个错误。
基本上,有两个地方可以放置requires-clause:直接在模板参数之后,或者,如果我们有函数参数,则在函数参数之后的lambda 说明符之后。所以这有效:
[]<auto> requires true noexcept {};
就像这样:
[]<auto>() noexcept requires true {};
就像这样:
[]<auto> requires true () noexcept requires true { };
但不是OP中的那个。
另外,不要写这个。