ホームページ >バックエンド開発 >C++ >移動キャプチャ Lambda から `std::function` を作成するにはどうすればよいですか?

移動キャプチャ Lambda から `std::function` を作成するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-24 10:12:37378ブラウズ

How Can I Create an `std::function` from a Move-Capturing Lambda?

移動キャプチャ Lambda からの std::function の作成

移動のみの型からの std::function の作成移動キャプチャ ラムダとして使用すると、移動コンストラクターの制限によりエラーが発生する可能性があります。この制限は、std::function の定義および構築方法に起因します。

std::function コンストラクターを理解する

std::function コンストラクターは次の中で呼び出すことができます。 2 つの方法:

  1. std::function(F f);
  2. std::function(allocator_arg_t, const A& a, F f);

どちらの場合も、ラムダ (F) は CopyConstructible である必要があります。これは、ラムダを std::function に直接移動できないことを意味します。

さらに、演算子 = はコンストラクターとスワップに関して定義されており、同じ制限が適用されることを意味します。

移動専用タイプの結果

したがって、移動のみの型をキャプチャする移動キャプチャ ラムダからの std::function 。これを試みると、暗黙的に削除されたコピー コンストラクターが原因でコンパイル時エラーが発生します。

代替解決策

この問題を回避するには、次のようにします。 shared_ptr を使用して移動専用型をラップし、ラムダでshared_ptrをキャプチャします。 shared_ptr は型がコピー可能であることを保証し、ラムダから std::function を作成できるようにします。

以上が移動キャプチャ Lambda から `std::function` を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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