C 11 ラムダでの参照による参照のキャプチャ
質問:
次のコード スニペット:
<code class="cpp">#include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ 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 への有効な参照を保持していることを意味します。
説明:
前の回答の一部の不正確さに対処するには:
この特定のケースでは、変数はx はラムダの到達範囲内にあり、参照によってキャプチャされます。したがって、参照は有効なままであり、ラムダは i の変更された値にアクセスし続けることができます。
結論:
このコードは、次による参照の正しいキャプチャを示しています。ラムダでの参照。未定義の動作を呼び出すことなく 5 を出力することが保証されています。
以上がC 11 ラムダでの参照による参照のキャプチャは、変更された値へのアクセスを保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。