C 11 ラムダの値によるキャプチャの詳細: 「可変」キーワードの必要性を解明する
C 11 では、ラムダ式は以下を提供します。匿名関数オブジェクトを作成するための強力なメカニズム。ただし、値でキャプチャする場合、悪名高い「mutable」キーワードが頻繁に浮上し、開発者はその目的について疑問を感じます。
次のスニペットを考えてみましょう。
#include <iostream> int main() { int n; [&](){n = 10;}(); // OK [=]() mutable {n = 20;}(); // OK // [=](){n = 10;}(); // Error: a by-value capture cannot be modified in a non-mutable lambda std::cout << n << "\n"; // "10" }
2 番目のラムダでは、コンパイラーはエラーを報告します。なぜこのキーワードが必要なのかという疑問が生じます。
関数オブジェクトの暗黙の契約
ラムダ式は関数オブジェクトのインスタンスです。関数オブジェクトは、関数プログラミングの基本原則である参照透過性を遵守することが期待されます。これは、同じ引数セットで呼び出された場合、結果は常に同じである必要があることを意味します。
値でキャプチャする場合、ラムダ式は変数のローカル コピーを作成します。ただし、これには潜在的な問題が生じます。ラムダがコピーを変更すると、元の変数の値が変更され、参照透明性の原則に違反する可能性があります。
「Mutable」による参照性の強制
「mutable」キーワードこの暗黙の契約を破ります。これを指定すると、コンパイラはラムダ式でキャプチャされた値を変更できるようになります。これにより、開発者はラムダの可変性と副作用を明示的に制御できるようになります。
「可変」を指定しない場合、コンパイラはラムダがキャプチャされた値を変更できないようにすることで、参照の透過性を強制します。これにより、ラムダは引数の指定されたセットに対して常に同じ結果を返し、真の関数オブジェクトになります。
バランスを取る
「可変」キーワード参照の透明性とキャプチャされた値を変更する柔軟性の間で必要なバランスを提供します。これにより、開発者はラムダが外部の世界に影響を与えることができるかどうかを選択できます。
したがって、値によるキャプチャのラムダの "mutable" キーワードは単なる規約ではなく、関数オブジェクトの基本的な性質: 信頼性と予測可能な動作。
以上がC 11 Lambda Capture-by-Value で「mutable」キーワードが必要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。