ホームページ > バックエンド開発 > C++ > コピー不可能なオブジェクトを含む移動キャプチャ Lambda から `std::function` を作成できないのはなぜですか?

コピー不可能なオブジェクトを含む移動キャプチャ Lambda から `std::function` を作成できないのはなぜですか?

Linda Hamilton
リリース: 2024-12-18 13:25:24
オリジナル
866 人が閲覧しました

Why Can't I Create an `std::function` from a Move-Capturing Lambda with a Non-Copyable Object?

移動キャプチャ ラムダ式から std::function を作成する: 制限を明らかにする

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート