Move-Capture Lambda 式からの std::function の作成
ラムダ式から std::function オブジェクトを作成する問題を理解することが重要です。 Move Capture を使用してラムダ式を作成することは可能ですが、std::function 内でラムダ式をカプセル化しようとすると、エラーが発生する可能性があります。
エラーの例
複数の試行移動キャプチャ ラムダを std::function に変換すると、一貫して「暗黙的に削除されたコピー コンストラクターの呼び出し」というエラーが発生します。 ' ムーブ キャプチャ ラムダの必要性 ラムダ式のムーブ キャプチャは、オブジェクトの所有権を共有するシナリオで必要になります。カスタム UI ライブラリなどでは実行できません。これらのライブラリは、std::function を使用してイベント ハンドラーを登録するための on_mouse_down() や Push_undo_action() などのメソッドを提供します。リソースの効率的な所有権を確保するには、以前の面倒な「release/acquire-in-lambda」イディオムよりも、ラムダ式でのムーブ キャプチャの方が優先されます。 std::function 構築の制限 関数オブジェクトを直接指定するための std::function コンストラクターには次のものがあります。署名: これらの保証には次のものが含まれます: Move-Capture への適用 ムーブ キャプチャを使用したラムダ式は F のコピー可能性要件に違反しませんが、多くの場合、ムーブ キャプチャ型 ( std::unique_ptr) は、必要なコピー コンストラクターを提供しません。その結果、これらの move-capture ラムダからの std::function の構築は実行不可能になります。 結論 move- の変換に注意することが重要です。移動専用型の処理における std::function コンストラクターの制限のため、ラムダを std::function にキャプチャすることはできません。この制限は、カプセル化された関数オブジェクトのコピーを維持するために std::function が必要であることから生じています。 以上がMove-Capture Lambda から `std::function` を作成できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。template <class F> function(F f);</p>
<p>ただし、別の関連コンストラクターは、特定の保証を提供するアロケーターと型への参照を受け入れます:</p>
<pre class="brush:php;toolbar:false">template <class F, class A> function(allocator_arg_t, const A& a, F f);