ホームページ  >  記事  >  バックエンド開発  >  C ラムダ式の一意のポインターを安全にキャプチャするにはどうすればよいですか?

C ラムダ式の一意のポインターを安全にキャプチャするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-22 10:54:11217ブラウズ

How Can I Safely Capture a Unique Pointer in a C   Lambda Expression?

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 &amp;t) {
    return t;
}

template<typename T>
T move(T &amp;t) {
    return std::move(t);
}

左辺値参照に move を使用する場合は、未定義の動作が発生する可能性があるので注意する必要があります。たとえば、move(A()) を使用して一時オブジェクトを移動することは避けてください。代わりに、左辺値参照と右辺値参照に個別の移動バージョンとコピー バージョンを提供することをお勧めします。

したがって、ラムダ式に一意のポインタをキャプチャする場合、ラムダ一般化キャプチャは所有権の移転を処理する便利で明示的な方法を提供し、確実に所有権の移転を処理します。適切な生涯管理。

以上がC ラムダ式の一意のポインターを安全にキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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