显式指定通用 lambda 的 operator() 模板参数是否合法?
Is it legal to explicitly specify a generic lambda's operator() template arguments?
以下C++代码是否符合标准?
#include <iostream>
int main()
{
[](auto v){ std::cout << v << std::endl; }.operator()<int>(42);
}
clang++ 3.8.0和g++ 7.2.0都可以很好地编译此代码(编译器标志-std=c++14 -Wall -Wextra -Werror -pedantic-errors
)。
这确实符合标准。该标准规定必须有一个成员operator()
,并且它在其参数声明子句中每次出现auto
都有一个模板参数。没有任何措辞禁止明确提供这些。
底线:lambda 的调用运算符只是一个普通函数(模板,如果是泛型)。
作为参考,相关标准条款:
非泛型 lambda 表达式的闭包类型具有公共 内联函数调用运算符 (16.5.4),其参数和返回 类型由 lambda 表达式的 分别是参数声明子句和尾随返回类型。对于泛型 lambda,闭包类型具有公共内联函数 调用运算符成员模板 (17.5.2),其模板参数列表 由一个发明的类型模板组成 - 每次出现的参数 的 auto 在 lambda 的参数声明子句中,按 外观。发明的类型模板参数是一个参数包 如果相应的参数声明声明了一个函数 参数包 (11.3.5)。返回类型和函数参数 函数调用运算符模板派生自 lambda 表达式的尾随返回类型和 参数声明子句,通过替换 auto 的每次出现 带有名称的参数声明子句的 decl 说明符 相应的发明模板参数。
N4659 (C++17) 中的 8.1.5.1/3 [expr.prim.lambda.closure] 强调我的。
是的,它似乎是明确定义的,因为 lambdasoperator()
的模板参数是严格定义的。
[expr.prim.lambda]/5
。
对于泛型 lambda,闭包类型具有公共内联函数 调用运算符成员模板 (14.5.2),其模板参数列表由一个发明的类型模板参数组成,用于 lambda 的参数声明子句中每次出现的auto
,按出现的顺序排列。
。
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 如何检查给定的参数是否为 cv::noArray()?
- 如果返回 -1,时间() 的参数是否被修改?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 检查两个模板参数是否相同
- 空函数的参数是否加载到缓存中?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 了解'this'或其他参数是否为右值
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- shared_ptr构造函数参数是否应按值传递
- 如何检查模板参数是否为给定值?
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 通过 ssh 发送参数.是否有非阻塞输入函数?
- 如何检查运算符 != 模板参数是否存在 C++ 17?
- 常量引用函数参数:是否可以禁止临时对象?
- 如何检查模板参数是否为 std::variant?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 移动 l 值参考参数是否是一种不好的做法?
- 显式指定通用 lambda 的 operator() 模板参数是否合法?