ホームページ  >  記事  >  バックエンド開発  >  C 11 ラムダでの参照による参照のキャプチャは、変更された値へのアクセスを保証しますか?

C 11 ラムダでの参照による参照のキャプチャは、変更された値へのアクセスを保証しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 22:39:03376ブラウズ

Does Capturing a Reference by Reference in C  11 Lambdas Guarantee Access to the Modified Value?

C 11 ラムダでの参照による参照のキャプチャ

質問:

次のコード スニペット:

<code class="cpp">#include <functional>
#include <iostream>

std::function<void()> make_function(int&amp; x) {
    return [&amp;]{ std::cout << x << std::endl; };
}

int main() {
    int i = 3;
    auto f = make_function(i);
    i = 5;
    f();
}</code>

このプログラムが未定義の動作を起こすことなく 5 を出力することを保証できますか?この質問は、変数 x を参照 ([&]) によってキャプチャする場合に特に発生し、関数 make_function が返された後で変数への参照をキャプチャすると、ダングリング参照が発生するかどうかについて懸念されます。

答え:

はい、コードは動作することが保証されています。

説明:

C 11 ラムダ仕様ここで取得した参照は、最初に参照されたオブジェクトが存在する限り有効であることを示します。これは、関数が戻った後に make_function のパラメータ x がスコープ外になっても、ラムダ クロージャは整数 i への有効な参照を保持していることを意味します。

説明:

前の回答の一部の不正確さに対処するには:

  • C の「スコープ」とは、非修飾名の検索によって名前が宣言に関連付けられる、コードの静的な語彙領域を指します。これは有効期間とは直接関係がありません。
  • ラムダの「スコープに到達する」ルールは、有効期間ではなく構文ルールに基づいてキャプチャが許可されるタイミングを決定します。

この特定のケースでは、変数はx はラムダの到達範囲内にあり、参照によってキャプチャされます。したがって、参照は有効なままであり、ラムダは i の変更された値にアクセスし続けることができます。

結論:

このコードは、次による参照の正しいキャプチャを示しています。ラムダでの参照。未定義の動作を呼び出すことなく 5 を出力することが保証されています。

以上がC 11 ラムダでの参照による参照のキャプチャは、変更された値へのアクセスを保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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