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