移動キャプチャ ラムダ式から std::function を作成しようとすると問題が発生する場合がありますラムダ自体の作成には問題がないにもかかわらず。これは、std::function コンストラクターとその代入演算子によって課される制限によるものです。
std::function コンストラクターとoperator= では、引数が CopyConstructible である必要があります。ただし、移動のみの型 (std::unique_ptr など) をキャプチャする移動キャプチャ ラムダは、CopyConstructible にすることはできません。
明確にするために、移動キャプチャとは、ラムダ式で使用されるキャプチャ メカニズムを指します。キャプチャされた変数のコピーを作成するコピー キャプチャとは対照的に、移動キャプチャは変数の所有権をラムダに転送します。
提供されたコードは問題を示しています:
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; }; std::function<void()> bar = foo; // Error: attempts to copy-construct 'foo'
ラムダ式「foo」は、移動によって一意のポインタ「pi」をキャプチャし、移動専用型になります。したがって、「foo」はコピーできないため、「foo」から std::function を構築することはできません。
この制限を回避するには、std::bind の使用やラッパー クラスの作成などの代替アプローチを検討してください。これはラムダをカプセル化し、CopyConstructible インターフェイスを提供します。
以上がMove-Capture Lambda から std::function を作成できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。