明确指定泛型lambda的operator()模板参数是否合法?

Con*_*tor 9 c++ lambda templates language-lawyer generic-lambda

以下C++代码标准是否兼容?

#include <iostream>

int main()
{
    [](auto v){ std::cout << v << std::endl; }.operator()<int>(42);
}
Run Code Online (Sandbox Code Playgroud)

既铛++ 3.8.0和克++ 7.2.0 编译该代码细(编译器标志-std=c++14 -Wall -Wextra -Werror -pedantic-errors).

Bau*_*gen 13

这确实符合标准.该标准规定必须有一个成员operator(),并且auto在其paramater-declaration-clause中每次出现都有一个模板参数.没有措辞禁止明确提供这些措辞.

行的底部:lambda的调用运算符只是一个普通函数(模板,如果是通用的).


供参考,相关标准条款:

非泛型lambda表达式的闭包类型有一个公共内联函数调用操作符(16.5.4),其参数和返回类型分别由lambda-expression的parameter-declaration-clause和trailing-return-type描述. 对于泛型lambda,闭包类型有一个公共内联函数调用操作符成员模板(17.5.2),其template-parameter-list由lambda的parameter-declaration-clause中每次出现auto的一个发明类型模板参数组成,按出场顺序.如果相应的参数声明声明了函数参数包(11.3.5),则本发明的类型模板参数是参数包.函数调用操作符模板的返回类型和函数参数是通过将参数声明子句的decl-specifiers中每次出现的auto替换为lambda-expression的trailing-return-type和parameter-declaration-clause而得到的.相应发明的模板参数的名称.

N4659(C++ 17)中的8.1.5.1/3 [expr.prim.lambda.closure],强调我的.


Hol*_*Cat 11

是的,它似乎是明确定义的,因为lambdas的模板参数operator()是严格定义的.

[expr.prim.lambda]/5

...
对于通用lambda,闭包类型有一个公共内联函数调用操作符成员模板(14.5.2),其template-parameter-list包含一个发明类型模板参数, 用于autolambda 参数声明中的每次出现-条款,按照出现的顺序.
...