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]) とは対照的に、参照によるキャプチャ ([&x]) は、参照が存続期間外も存続できるようにする C 標準内の固有の例外を利用します。これは、ラムダ式によってキャプチャされた参照が、ラムダ クロージャ型へのメンバー アクセスとして実装されるためです。
スコープとライフタイムの考慮事項
到達スコープのルールに注意することが重要です。ラムダは純粋に構文上のものであり、このシナリオでは役割を果たしません。参照されるエンティティ x は、ラムダの到達範囲内にあり、キャプチャできます。
標準の文言
[expr.prim.lambda]/17 によるとC 標準では、コピーによってキャプチャされた式のみが、ラムダ クロージャ型でのメンバー アクセスへの変換を受けます。参照によってキャプチャされた式は単に変更されずにそのまま残され、元のエンティティを示し続けます。
さらに、この規格では、有効期間外に使用される参照の問題については明示的に対処していません。ただし、有効期間外の参照を使用しても (独自のイニシャライザまたは先行するクラス メンバーから参照されない限り) ペナルティはないため、このコードは意図したとおりに機能します。
結論
C 11 ラムダでの参照による参照のキャプチャは期待どおりに動作することが保証されており、未定義の動作を呼び出すことなく参照された整数の更新された値を出力します。これは、標準のラムダ キャプチャの定義と、特定のコンテキスト内で有効期間外の参照を使用する場合のペナルティが確立されていないことに基づいています。
以上がC 11 ラムダで参照による参照をキャプチャすると、更新された値が出力されることが保証されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。