C 11 では、ラムダでの変数のキャプチャは通常、参照によって行われます。この参照はラムダが存在する限り生き続けますが、キャプチャされた変数が移動されると意図しない動作が発生する場合があります。
C 14 では、一般化されたラムダ キャプチャが導入され、移動キャプチャが可能になりました。これにより、一意のポインタなどの移動専用型の便利な操作が可能になります。
std::make_unique<int>() .then([u = std::move(u)] { do_something_with(u); });
C 14 より前では、ヘルパー関数を使用して移動キャプチャをエミュレートできます。
このアプローチではラッパー クラスを作成します。 rref_impl は値をカプセル化し、その有効期間を管理します。
template <typename T> using rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
ただし、ラムダで rref をキャプチャするとコピーが可能になり、ランタイム エラーが発生する可能性があります。
このメソッドは、キャプチャされた値を参照によって取得し、その関数を呼び出すラムダを返す関数を使用します。
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 サイトの他の関連記事を参照してください。