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

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

Susan Sarandon
リリース: 2024-12-13 10:10:11
オリジナル
114 人が閲覧しました

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

移動キャプチャ ラムダからの std::function の構築

移動キャプチャ ラムダ式から 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 サイトの他の関連記事を参照してください。

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