私の質問は、ラムダ式の下に例として示されている、次のネストされたラムダ式に関するものです。
// 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
[](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; }
内部printer
では、ネストされた (匿名の) ラムダ式
return [=](auto&&... ts){}
コピーによるキャプチャーprinter
とそのパラメーターパックをrvalue
参考に。
(無名) ラムダ式の本体内で、式
printer(std::forward<decltype(ts)>(ts)...);
パラメータパックを[基本的にusingprinter
の呼び出しのように見える]に転送しますprinter
operator ()
(匿名) ラムダ式の本体内の最後の式では、(匿名) nullary ラムダ式がprinter
、パラメーター パックと共に、コピーによって外側のスコープからクロージャー オブジェクトをキャプチャするように見えprinter
、転送されたパラメーターを使用してクロージャー オブジェクトを呼び出します。パック。
return [=] { printer(ts...); };
今、私がここで何かを得ていないことは非常に明白です. 本質的に、printer
クロージャー オブジェクトを呼び出す 2 つの異なる行が (匿名の) ラムダ式の本体内に提供されているのはなぜですか?
専門家の誰かがもっと光を当てることができますか?