C 11 の Lambda Capture-by-Value の必要性を理解する
C 11 のラムダ式には、次の 2 つのキャプチャ モードが用意されています。参照によるキャプチャと値によるキャプチャ。変数を値でキャプチャする場合、ラムダは変数を変更できます。ただし、この動作は自動的に行われるわけではありません。変更を許可するには、「mutable」キーワードが必要です。
「Mutable」要件の背後にある根拠
ラムダと従来の名前付き関数の主な違いの 1 つは、ラムダが設計されていることです。ローカルの一時的な状態で動作する一連の操作をカプセル化します。デフォルトでは、この状態はラムダの実行を通じて一定のままである必要があります。
「可変」なしで値によるキャプチャ変数の変更を許可すると、ラムダは関数決定論の原則に違反します。ラムダは、周囲のコードの状態に関係なく、呼び出されるたびに同じ出力を生成する必要があります。値によるキャプチャ変数を変更すると非決定性が導入され、ラムダの動作の予測が困難になります。
値によるキャプチャについて
値によるキャプチャとはキャプチャされた変数のローカル コピーを作成するように設計されています。このコピーは不変であることを意図しており、ラムダの動作の一貫性が保たれます。ただし、ラムダがキャプチャされた変数のコピーを変更する必要がある状況が考えられます。
たとえば、次のコードを考えてみましょう。
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" }
「mutable」がないと、ラムダ キャプチャは-by-value は、「n」のコピーを変更できません。これにより、ラムダの実行によって元の "n" 変数が変更されても、出力の一貫性が保たれます。
"mutable" を使用することで、ラムダがキャプチャされたコピーの変更を許可されていることを明示的に示します。これにより、外側の関数の動作に影響を与えることなく、ラムダ内の "n" のコピーを変更できます。
以上がC 11 ラムダでキャプチャされた変数を変更するのに「mutable」キーワードが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。