ホームページ >バックエンド開発 >C++ >Move-Capture Lambda から `std::function` を作成できないのはなぜですか?

Move-Capture Lambda から `std::function` を作成できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-17 01:22:25283ブラウズ

Why Can't I Create a `std::function` from a Move-Capturing Lambda?

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 コンストラクターには次のものがあります。署名:

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);

これらの保証には次のものが含まれます:

  • F はコピー構築可能である必要があります
  • f は指定された引数の型で呼び出し可能である必要があります(ArgTypes) と戻り値の型 (R)
  • A のコピー コンストラクターとデストラクターは例外をスローしてはなりません

Move-Capture への適用

ムーブ キャプチャを使用したラムダ式は F のコピー可能性要件に違反しませんが、多くの場合、ムーブ キャプチャ型 ( std::unique_ptr) は、必要なコピー コンストラクターを提供しません。その結果、これらの move-capture ラムダからの std::function の構築は実行不可能になります。

結論

move- の変換に注意することが重要です。移動専用型の処理における std::function コンストラクターの制限のため、ラムダを std::function にキャプチャすることはできません。この制限は、カプセル化された関数オブジェクトのコピーを維持するために std::function が必要であることから生じています。

以上がMove-Capture Lambda から `std::function` を作成できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。