ホームページ >バックエンド開発 >C++ >C ラムダ、特に C 11 で移動キャプチャを実現するにはどうすればよいですか?

C ラムダ、特に C 11 で移動キャプチャを実現するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 14:51:10519ブラウズ

How Can I Achieve Move Capture in C   Lambdas, Especially in C  11?

C ラムダでの移動キャプチャを理解する

C 11 では、ラムダでの変数のキャプチャは通常、参照によって行われます。この参照はラムダが存在する限り生き続けますが、キャプチャされた変数が移動されると意図しない動作が発生する場合があります。

A C 14 ソリューション: 一般化されたラムダ キャプチャ

C 14 では、一般化されたラムダ キャプチャが導入され、移動キャプチャが可能になりました。これにより、一意のポインタなどの移動専用型の便利な操作が可能になります。

std::make_unique<int>()
    .then([u = std::move(u)] { do_something_with(u); });

C 11 の回避策

C 14 より前では、ヘルパー関数を使用して移動キャプチャをエミュレートできます。

方法 1: make_rref

このアプローチではラッパー クラスを作成します。 rref_impl は値をカプセル化し、その有効期間を管理します。

template <typename T> using rref_impl = ...;
auto rref = make_rref(std::move(val));

[rref]() mutable { std::move(rref.get()); };

ただし、ラムダで rref をキャプチャするとコピーが可能になり、ランタイム エラーが発生する可能性があります。

方法 2: Capture( ) Function

このメソッドは、キャプチャされた値を参照によって取得し、その関数を呼び出すラムダを返す関数を使用します。

template <typename T, typename F> using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward<decltype(v)>(v); });

これにより、ラムダのコピーが防止され、キャプチャされた値が確実にラムダのスコープに移動されます。

これらの回避策は、一般化された回避策ほど洗練されていないことに注意してください。 C 14 ではラムダ キャプチャが使用されますが、言語の以前のバージョンでムーブ キャプチャをエミュレートする方法が提供されます。

以上がC ラムダ、特に C 11 で移動キャプチャを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。