C の領域で、 std::function を構築するタスク移動をキャプチャするラムダ式からは、多くの場合発生します。移動キャプチャのラムダ式自体はシームレスに作成できますが、std::function 内でカプセル化できないという謎があります。
この例が示すように、
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; };
この例は、障害に遭遇することなく、移動をキャプチャするラムダ式を簡単に構築します。ただし、このラムダを std::function 内に含めようとすると、次のようなエラーが発生します。
std::function<void()> bar = foo; std::function<void()> bar{foo}; std::function<void()> bar{std::move(foo)}; std::function<void()> bar = std::move(foo); std::function<void()> bar{std::forward<std::function<void()>>(foo)}; std::function<void()> bar = std::forward<std::function<void()>>(foo);
std::function クラスの複雑さを詳しく調べると、次のコンストラクターが見つかります。
template<class F> function(F f);
このコンストラクターは根本的な問題を明らかにします。カプセル化された関数 F がコピー構築可能。ただし、移動をキャプチャするラムダ式はこの基準を満たしていません。代わりに、コピーで構築できないオブジェクトを移動キャプチャします。
したがって、移動キャプチャ ラムダ式から std::function を構築することは実現可能ですが、ラムダ式の場合は乗り越えられないハードルに直面すると結論付けます。 move-capture は、コピー構築不可能なオブジェクトをキャプチャします。このようなシナリオでは、「ラムダで解放/取得」イディオムなどの代替アプローチが必要になります。
以上がコピー不可能なオブジェクトを含む移動キャプチャ Lambda から `std::function` を作成できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。