C 11 では、ラムダでの変数のキャプチャは通常、参照によって行われます。この参照はラムダが存在する限り生き続けますが、キャプチャされた変数が移動されると意図しない動作が発生する場合があります。
C 14 では、一般化されたラムダ キャプチャが導入され、移動キャプチャが可能になりました。これにより、一意のポインターなどの移動専用型の便利な操作が可能になります。
std::make_unique() .then([u = std::move(u)] { do_something_with(u); });
C 14 より前では、移動キャプチャは次を使用してエミュレートできます。ヘルパー関数:
このアプローチでは、ラッパー クラスを作成します。 rref_impl、値をカプセル化し、その有効期間を管理します。
templateusing rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
ただし、ラムダで rref をキャプチャするとコピーが可能になり、ランタイム エラーが発生する可能性があります。
このメソッドはキャプチャされた値を参照によって取得し、キャプチャされた値を引数として関数を呼び出すラムダを返す関数。
templateusing capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward (v); });
これにより、ラムダとキャプチャされた値がラムダのスコープに確実に移動されるようにします。
これらの回避策は、C で一般化されたラムダ キャプチャほど洗練されていないことに注意してください。 14 ですが、以前のバージョンの言語で移動キャプチャをエミュレートする方法を提供します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3