【发布时间】:2019-09-29 03:49:10
【问题描述】:
我的问题与以下嵌套的 lambda 表达式有关,在 Lambda expressions 下作为示例提供
// generic lambda, operator() is a template with one parameter
auto vglambda = [](auto printer) {
return [=](auto&&... ts) // generic lambda, ts is a parameter pack
{
printer(std::forward<decltype(ts)>(ts)...);
return [=] { printer(ts...); }; // nullary lambda (takes no parameters)
};
};
auto p = vglambda([](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; });
auto q = p(1, 'a', 3.14); // outputs 1a3.14
q(); // outputs 1a3.14
以下是我对上述表达式的解读方式:
在表达式中
auto p = vglambda([](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; });
闭包对象vglambda被初始化为闭包对象printer,其类型对应于lambda表达式
[](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; }
在printer 中,嵌套的(匿名)lambda 表达式
return [=](auto&&... ts){}
通过复制捕获printer 及其参数包作为rvalue 引用。
在(匿名)lambda 表达式的主体中,表达式
printer(std::forward<decltype(ts)>(ts)...);
将参数包转发到printer [在本质上似乎是使用operator () 调用printer]
在(匿名)lambda 表达式主体内的最终表达式中,(匿名)空值 lambda 表达式似乎通过复制从封闭范围捕获 printer 闭包对象以及参数包,并调用printer 闭包对象及其转发参数包。
return [=] { printer(ts...); };
现在,很明显我在这里没有得到任何东西。本质上,为什么在(匿名)lambda 表达式的主体中提供了两条不同的调用 printer 闭包对象的行,一条没有(匿名)空值 lambda 表达式,另一条在内部?
有哪位专家可以提出更多观点吗?
【问题讨论】:
-
您的代码使用了从 C++14 引入的通用 lambda;所以我在 C++14 中更改了你的 C++11 标签
标签: c++ lambda c++14 variadic-templates generic-lambda