ホームページ > バックエンド開発 > C++ > 移動キャプチャ ラムダ式から `std::function` を作成できますか?

移動キャプチャ ラムダ式から `std::function` を作成できますか?

Barbara Streisand
リリース: 2024-12-11 13:46:11
オリジナル
1048 人が閲覧しました

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

移動キャプチャ ラムダ式からの std::function の作成

移動キャプチャ ラムダ式から std::function を構築することができます。ただし、特定の制限が適用されます。

テンプレート コンストラクター

次のテンプレートを使用して、移動キャプチャ ラムダから std::function を構築できます。コンストラクター:

template<class F>
function(F f);
ログイン後にコピー

要件

このコンストラクターが機能するには、次の要件を満たす必要があります:

  • ラムダ式のキャプチャ
  • ラムダ式は、コピー構築可能である必要があります。指定された引数の型と戻り値の型。
  • ラムダのキャプチャのコピー コンストラクターとデストラクターは例外をスローしてはなりません。

移動専用型

から std::function を構築することはできません 移動専用型を移動キャプチャするラムダ。これは、std::function のコピー コンストラクターと代入演算子が、コピー構成可能な型を必要とするコンストラクターとして定義されているためです。

次のコード スニペットを考えてみましょう。 :

auto pi = std::make_unique<int>(0);

// Move-capturing lambda
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);
ログイン後にコピー

これは、pi が移動専用型であり、std::function のコピー コンストラクターにはコピー構築可能な型が必要であるためです。

したがってstd::function で移動キャプチャ ラムダを使用したい場合は、そのキャプチャがコピー構築可能であることを確認してください。

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

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