Maison >développement back-end >C++ >Pourquoi le mot clé « mutable » est-il nécessaire pour modifier les variables capturées dans C 11 Lambdas ?

Pourquoi le mot clé « mutable » est-il nécessaire pour modifier les variables capturées dans C 11 Lambdas ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-28 11:10:14695parcourir

Why Is the `mutable` Keyword Necessary for Modifying Captured Variables in C  11 Lambdas?

Comprendre la nécessité de "Mutable" en C 11 Lambda Capture-by-Value

Les expressions Lambda en C 11 offrent deux modes de capture : capture par référence et capture par valeur. Lors de la capture de variables par valeur, le lambda peut les modifier. Toutefois, ce comportement n’est pas automatique. Le mot-clé "mutable" est requis pour permettre la modification.

Raison d'être de l'exigence "Mutable"

Une différence clé entre les lambdas et les fonctions nommées traditionnelles est que les lambdas sont conçus pour encapsuler un ensemble d’opérations qui fonctionnent sur un état local et temporaire. Par défaut, cet état doit rester constant tout au long de l'exécution du lambda.

En autorisant la modification des variables de capture par valeur sans « mutable », les lambdas violeraient le principe du déterminisme des fonctions. Un lambda doit produire la même sortie à chaque fois qu'il est appelé, quel que soit l'état du code environnant. La modification des variables de capture par valeur introduit un non-déterminisme, ce qui rend le comportement du lambda difficile à prédire.

Comprendre la capture par valeur

La capture par valeur est conçu pour créer une copie locale des variables capturées. Cette copie se veut immuable, garantissant que le comportement du lambda reste cohérent. Cependant, il peut y avoir des situations où le lambda doit modifier la copie de la variable capturée.

Par exemple, considérons le code suivant :

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"
}

Sans "mutable", la capture lambda -by-value ne peut pas modifier la copie de "n". Cela garantit que la sortie reste cohérente, même si l'exécution du lambda modifie la variable "n" d'origine.

En utilisant "mutable", nous indiquons explicitement que le lambda est autorisé à modifier la copie capturée. Cela nous permet de changer la copie de "n" dans le lambda sans affecter le comportement de la fonction englobante.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn