C 11 では、値によってキャプチャされたラムダは機能的に不変です。つまり、値を変更することはできません。デフォルトで値がキャプチャされます。この動作を修正するには、「mutable」キーワードを使用して、ラムダのスコープ内での変更を許可します。
次の例を考えてみましょう。
int main() { int n; [&]() { n = 10; }(); // OK, captures by reference [=]() mutable { n = 20; }(); // OK, captures by value with "mutable" // [=](){n = 10;}(); // Error, cannot modify by-value capture without "mutable" std::cout << n << "\n"; // Prints "10" }
疑問が生じます。なぜ「mutable」なのかということです。値によるキャプチャに必要なキーワード?
伝統的に、名前付き関数に渡されるパラメータは暗黙的に変更可能であり、内部での変更が可能です。機能。ただし、ラムダは参照によるキャプチャと値によるキャプチャの両方のメカニズムを提供しており、これらにより異なる動作が導入されます。
デフォルトでは、値によるキャプチャは外部変数のコピーを作成し、ラムダは外部変数のコピーのみを作成します。この一時的な値を操作します。 「mutable」がないと、キャプチャされた値を変更しようとすると、関数オブジェクトの不変性の原則に違反するため、コンパイラ エラーが発生します。
そのため、内部での変更を明示的に許可するために、「mutable」キーワードが導入されています。値によってキャプチャするラムダ。これは、キャプチャされたコピーを可変として扱うことができることをコンパイラに通知し、より伝統的な関数のような動作に戻ります。
要約すると、C の値によるキャプチャには「mutable」キーワードが必要です。ラムダが 11 個あるのは、ラムダのスコープ内でキャプチャされたコピーを変更できる一方で、関数オブジェクトの出力がその入力と一貫性を保つことが保証されるためです。
以上がC 11 ラムダの値によるキャプチャに「mutable」キーワードが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。