はじめに
C では、右辺値参照とも呼ばれる移動によるキャプチャを使用すると、オブジェクトの所有権をラムダ式に効率的に転送します。この手法は、オブジェクトのリソースをラムダ内で明示的に管理する必要がある状況で特に役立ちます。
C 14 では、一般化されたラムダ キャプチャが洗練されたソリューションを提供します。ムーブキャプチャ用。この機能を使用すると、移動セマンティクスを使用して値によって変数を取得するラムダ式を宣言できます。
using namespace std; auto u = make_unique<some_type>(some, parameters); go.run([u = move(u)] { do_something_with(u); });
このアプローチでは、u の所有権をラムダに移動し、リソースが適切に解放されるようにします。さらに、オブジェクトをラムダから移動する必要がある場合は、ラムダを可変として宣言する必要があります。
C 11 では、移動キャプチャは直接実行されません。サポートされました。ただし、この動作をエミュレートできる技術があります。 1 つのアプローチは、ヘルパー関数を使用して右辺値参照 (rref) を作成することです:
template <typename T> struct rref_impl { rref_impl() = delete; rref_impl(T &&x) : x(std::move(x)) {} // ... (remaining implementation) }; template<typename T> rref_impl<T> make_rref(T &&x) { return rref_impl<T>{std::move(x)}; }
このヘルパー関数を使用すると、ラムダ内で移動することでオブジェクトをキャプチャできます:
unique_ptr<int> p{new int(0)}; auto rref = make_rref(std::move(p)); auto lambda = [rref]() mutable -> unique_ptr<int> { return rref.move(); };
取得した右辺値参照を変更できるように、ラムダは可変として宣言されていることに注意してください。
C 11 で一般化ラムダ キャプチャをエミュレートするもう 1 つのアプローチは、カスタム クラスを使用して変数をキャプチャし、それをラムダの外に移動する方法を提供することです。
template <typename T, typename F> struct capture_impl { T x; F f; // ... (remaining implementation) }; template <typename T, typename F> capture_impl<T,F> capture(T &&x, F &&f) { return capture_impl<T,F>(std::forward<T>(x), std::forward<F>(f)); }
このクラスを使用すると、移動によって変数をキャプチャし、 lambda:
unique_ptr<int> p{new int(0)}; auto lambda = capture(std::move(p), [](unique_ptr<int> &p) { return std::move(p); });
前のアプローチとは異なり、キャプチャされた型がコピー可能でない場合、このラムダはコピーできません。これにより、ラムダをコピーする際の潜在的なエラーが防止されます。
以上がC のラムダ式で移動してオブジェクトを効率的にキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。