1

私の質問は、ラムダ式の下に例として示されている、次のネストされたラムダ式に関するものです。

// 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の呼び出しのように見える]に転送しますprinteroperator ()

(匿名) ラムダ式の本体内の最後の式では、(匿名) nullary ラムダ式がprinter、パラメーター パックと共に、コピーによって外側のスコープからクロージャー オブジェクトをキャプチャするように見えprinter、転送されたパラメーターを使用してクロージャー オブジェクトを呼び出します。パック。

return [=] { printer(ts...); };

今、私がここで何かを得ていないことは非常に明白です. 本質的に、printerクロージャー オブジェクトを呼び出す 2 つの異なる行が (匿名の) ラムダ式の本体内に提供されているのはなぜですか?

専門家の誰かがもっと光を当てることができますか?

4

1 に答える 1