En C 11, les lambdas capturés par valeur sont fonctionnellement immuables, ce qui signifie qu'ils ne peuvent pas modifier le valeurs capturées par défaut. Pour modifier ce comportement, le mot-clé "mutable" est utilisé pour permettre des modifications dans la portée du lambda.
Considérons l'exemple suivant :
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" }
La question se pose : Pourquoi le "mutable" mot-clé nécessaire pour la capture par valeur ?
Traditionnellement, les paramètres passés aux fonctions nommées sont implicitement modifiables, ce qui permet des modifications au sein de la fonction. Cependant, les lambdas fournissent à la fois des mécanismes de capture par référence et de capture par valeur, qui introduisent un comportement distinct.
Par défaut, la capture par valeur crée une copie de la variable externe, et le lambda ne peut opérer sur cette valeur temporaire. Sans « mutable », toute tentative de modification de la valeur capturée entraînera une erreur du compilateur, car elle viole le principe d'immuabilité des objets fonction.
Par conséquent, le mot-clé « mutable » est introduit pour autoriser explicitement les modifications dans un lambda qui capture par valeur. Il signale au compilateur que la copie capturée peut être traitée comme mutable, revenant ainsi à un comportement de fonction plus traditionnel.
En résumé, le mot-clé "mutable" est requis pour la capture par valeur en C. 11 lambdas car il garantit que la sortie de l'objet fonction reste cohérente avec ses entrées, tout en permettant des modifications de la copie capturée dans la portée du lambda.
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!