C での一意の Ptr をラムダ式にキャプチャする
C では、一意のポインターとラムダを扱う場合、所有権をキャプチャすることが困難になる場合があります。一般的な試みの 1 つは、std::unique_ptr を参照によって渡し、それを lambda:
std::function<void()> getAction(std::unique_ptr<MyClass>& psomething); return [psomething]() { psomething->do_some_thing(); };
内でキャプチャすることですが、このアプローチは有効期間の問題によりコンパイルに失敗します。これに対処するために、C 14 ではラムダ一般化キャプチャが導入されました。これにより、所有権の譲渡を明示的に指定できるようになります。
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { return [auto psomething = move(psomething)]() { psomething->do_some_thing(); }; }
auto psomething = move(psomething) を使用することで、一意のポインタの所有権がラムダに譲渡され、
ただし、図に示すようにカスタムの移動とコピーの実装がある場合は、以下:
template<typename T> T copy(const T &t) { return t; } template<typename T> T move(T &t) { return std::move(t); }
左辺値参照に move を使用する場合は、未定義の動作が発生する可能性があるので注意する必要があります。たとえば、move(A()) を使用して一時オブジェクトを移動することは避けてください。代わりに、左辺値参照と右辺値参照に個別の移動バージョンとコピー バージョンを提供することをお勧めします。
したがって、ラムダ式に一意のポインタをキャプチャする場合、ラムダ一般化キャプチャは所有権の移転を処理する便利で明示的な方法を提供し、確実に所有権の移転を処理します。適切な生涯管理。
以上がC ラムダ式の一意のポインターを安全にキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。