C 11 の可変性とラムダ値によるキャプチャ
C 11 のラムダ式では、次のいずれかの方法で外部変数をキャプチャできます。参照または値によって。ただし、値でキャプチャする場合は、デフォルトで mutable キーワードが必要です。これは、特に名前付き関数に渡す従来のパラメーターには可変性が必要ないことを考えると、その必要性に関する疑問を引き起こしました。
可変性の背後にある理論
重要な違いは、関数オブジェクトとしてのラムダの性質。これらは、呼び出しのたびに一貫した結果を生成するように設計されています。ラムダ式がキャプチャされた変数を可変として宣言せずに変更できる場合、この原則に違反します。その結果、コンパイラのデフォルトでは、capture-by-value 変数は変更されないままであると想定されます。
Mutable 宣言
mutable キーワードにより、capture- の明示的な変更が可能になります。ラムダ式内の値渡し変数。これは、関数オブジェクトが現在の状態に基づいて異なる動作をすることを意図していることを認識します。たとえば、以下のラムダは実行されるたびにカウンターをインクリメントします。
int n = 0; [mutable](){ n++; }();
意味と代替
値によるキャプチャの可変性の要件により、次のことが保証されます。ラムダは決定的な動作を維持します。また、キャプチャされた変数が外部から変更されることを意図していない多くの場合、参照によるキャプチャの必要性も排除されます。ただし、mutable を過度に使用すると、コードの明確さが妨げられ、副作用が発生する可能性があることに注意してください。
以上が値による C 11 ラムダのキャプチャがデフォルトで変更可能なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。