C 11 ラムダでの参照による参照のキャプチャ
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>
このコードには、次のラムダがあります。整数変数 i への参照をキャプチャします。次に、main 関数の i を変更し、ラムダを呼び出します。問題は、ラムダが 3 を出力するか 5 を出力するかということです。
標準ベースの回答
コードは、未定義の動作を呼び出すことなく、5 を出力することが保証されています。
説明
C 11 標準 ([expr.prim.lambda]/17) に従って、コピーによってキャプチャされたエンティティを参照する ID 式のみがメンバー アクセスに変換されます。ラムダクロージャタイプについて。参照によってキャプチャされたエンティティを参照する ID 式はそのまま残され、外側のスコープで示されるのと同じエンティティを示します。
これは、ラムダ内の参照 x が変更されないことを意味します。 main 関数では引き続き同じ整数変数 i を参照します。したがって、main 関数で i を変更しても、ラムダには変更された値が表示されます。
以上がC 11 Lambda での参照による参照のキャプチャは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。