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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-21 05:23:10550ブラウズ

How Can I Correctly Capture Unique Pointers in C   Lambda Expressions?

ラムダ式内の一意のポインターのキャプチャ

ラムダ式内で一意のポインターをキャプチャしようとすると、困難に遭遇するのが一般的です。次のシナリオを考えてみましょう:

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 サイトの他の関連記事を参照してください。

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