ラムダ式内の一意のポインターのキャプチャ
ラムダ式内で一意のポインターをキャプチャしようとすると、困難に遭遇するのが一般的です。次のシナリオを考えてみましょう:
std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) { // Caller gives ownership of psomething return [psomething]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
ラムダが参照によって一意のポインターをキャプチャできないため、上記のコードはコンパイルに失敗します。この問題を解決するために、C 14 ではラムダ一般化キャプチャが導入されました。
C 14 の Lambda 一般化キャプチャ
ラムダ一般化キャプチャでは、値または移動によって変数をキャプチャできます。これは、以下に示すように、一意のポインターをキャプチャするときに = move() 構文を利用することで実現されます。
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { // Caller gives ownership of psomething return [auto psomething = std::move(psomething)]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
auto を使用すると、ラムダは一意のポインターである psomething の型を自動的に推定します。 = std::move(psomething) 式は、一意のポインターの所有権を明示的にラムダ式に移動します。
移動とコピーの実装
コピーの実装質問で提供されている移動関数は、2 フェーズのコピー/移動に有効です ([この StackOverflow で説明されているように) question](https://stackoverflow.com/questions/6322951/whats-the-difference-between-a-copy-constructor-and-a-move-constructor)).
ただし、重要ですC 11 では、std::move 式を通じて move 関数に別の意味が導入されたことに注意してください。 std::move 式は、適用されるオブジェクトを右辺値修飾し、基本的にオブジェクトを移動する必要があることを示します。したがって、ラムダ一般化キャプチャのコンテキストでは、一意のポインターで std::move を明示的に呼び出す必要はありません。ラムダは必要に応じて所有権を自動的に移動します。
以上がC ラムダ式の一意のポインターを正しくキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。