通用 lambda 的熟悉模板语法
Posted
技术标签:
【中文标题】通用 lambda 的熟悉模板语法【英文标题】:Familiar template syntax for generic lambdas 【发布时间】:2018-11-15 17:09:59 【问题描述】:对于 c++20,建议为通用 lambdas 添加以下语法p0428r2.pdf
auto f = []<typename T>( T t ) ;
但 gcc 8 中的当前实现不接受以下实例化:
f<std::string>("");
这是 gcc 中的实现错误还是缺少语言功能?我知道我们讨论的是提案而不是批准的规范。
完整示例(与模板函数语法比较):
template <typename T> void n( T t ) std::cout << t << std::endl;
auto f = []<typename T>( T t ) std::cout << t << std::endl; ;
int main()
f<std::string>("Hello"); // error!
n<std::string>("World");
抱怨以下错误:
main.cpp:25:22: 错误: '>' 标记之前的预期主表达式 f("你好");
【问题讨论】:
请注意,此功能的部分重点是允许约束 exant(由此推断)模板参数。 【参考方案1】:lambda 表达式的结果不是函数;它是一个函数对象。也就是说,它是一个具有operator()
重载的类类型。所以这个:
auto f = []<typename T>( T t ) ;
相当于这个:
struct unnamed
template<typename T>
void operator()(T t)
;
auto f = unnamed;
如果您想为 lambda 函数显式提供模板参数,则必须显式调用 operator()
:f.operator()<template arguments>(parameters);
。
【讨论】:
以上是关于通用 lambda 的熟悉模板语法的主要内容,如果未能解决你的问题,请参考以下文章
显式指定通用 lambda 的 operator() 模板参数是不是合法?