「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ Lambda、特に C++11 で移動キャプチャを実現するにはどうすればよいですか?

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

2024 年 12 月 23 日に公開
ブラウズ:199

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

C ラムダでの移動キャプチャについて

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

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

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

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

C 11 の回避策

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

方法 1: make_rref

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

template  using rref_impl = ...;
auto rref = make_rref(std::move(val));

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

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

メソッド 2: Capture() Function

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

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

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

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3