我的问题与以下嵌套 lambda 表达式有关,作为Lambda 表达式下的示例提供
// 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; });
闭包对象由其类型对应于 lambda 表达式vglambda
的闭包对象初始化printer
[](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
[在本质上似乎是printer
using的调用operator ()
]
在(匿名)lambda 表达式主体内的最后一个表达式中,(匿名)空值 lambda 表达式似乎printer
通过复制从封闭范围捕获闭包对象以及参数包,并printer
使用其转发参数调用闭包对象盒。
return [=] { printer(ts...); };
现在,很明显我在这里没有得到任何东西。本质上,为什么在(匿名)lambda 表达式的主体中提供了两条不同的调用printer
闭包对象的行,一条没有(匿名)空值 lambda 表达式,另一条在里面?
任何专家都可以提出更多的观点吗?