Maison >développement back-end >C++ >Quand le mot clé « mutable » est-il nécessaire dans la capture par valeur C 11 Lambda ?

Quand le mot clé « mutable » est-il nécessaire dans la capture par valeur C 11 Lambda ?

DDD
DDDoriginal
2024-11-29 04:22:13686parcourir

When is the `mutable` Keyword Necessary in C  11 Lambda Capture-by-Value?

Plonger dans C 11 Lambda Capture-by-Value : Démêler la nécessité d'un mot clé « mutable »

En C 11, les expressions lambda fournissent un mécanisme puissant pour créer des objets de fonction anonymes. Cependant, lors de la capture par valeur, le fameux mot-clé "mutable" fait souvent surface, laissant les développeurs s'interroger sur son objectif.

Considérez l'extrait suivant :

#include <iostream>

int main() {
    int n;
    [&amp;](){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 le mot-clé "mutable" dans le deuxième lambda, le compilateur signale une erreur. La question se pose : pourquoi ce mot-clé est-il nécessaire ?

Le contrat implicite des objets fonction

Les expressions lambda sont des instances d'objets fonction. Les objets fonction doivent adhérer au principe de base de la programmation fonctionnelle : la transparence référentielle. Cela signifie que lorsqu'il est appelé avec le même ensemble d'arguments, le résultat doit toujours être le même.

Lors de la capture par valeur, l'expression lambda crée une copie locale de la variable. Cependant, cela pose un problème potentiel. Si le lambda modifie la copie, la valeur de la variable d'origine peut changer, violant le principe de transparence référentielle.

Application de la référentielle avec "Mutable"

Le mot-clé "mutable" rompt ce contrat implicite. En le spécifiant, le compilateur permet à l'expression lambda de modifier la valeur capturée. Cela accorde au développeur un contrôle explicite sur la mutabilité et les effets secondaires du lambda.

Sans « mutable », le compilateur applique la transparence référentielle en empêchant le lambda de modifier les valeurs capturées. Cela garantit que le lambda renvoie toujours le même résultat pour un ensemble d'arguments donné, ce qui en fait un véritable objet fonction.

Trouver un équilibre

Le mot-clé "mutable" fournit un équilibre nécessaire entre la transparence référentielle et la flexibilité de modifier les valeurs capturées. Il permet au développeur de choisir si le lambda peut ou non affecter le monde extérieur.

Par conséquent, le mot-clé "mutable" dans les lambdas de capture par valeur n'est pas simplement une convention, mais une garantie cruciale qui préserve le nature fondamentale des objets fonction : comportement fiable et prévisible.

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