Capture Lambda et constance en C 0x
Une question courante se pose lorsque l'on travaille avec des expressions lambda en C 0x : existe-t-il un moyen de capturer par valeur et en même temps empêcher la valeur capturée d'être const ?
La norme du langage C spécifie que les expressions lambda qui capturent les variables par valeur le font de manière const. Cela signifie que la valeur capturée ne peut pas être modifiée à l'intérieur du lambda. Cependant, dans certains scénarios, il peut être nécessaire de capturer une variable par valeur tout en modifiant sa valeur.
Par exemple, considérons un foncteur de bibliothèque avec une méthode Operator() non const que nous voulons capturer et appelle une lambda. Le code suivant ne sera pas compilé :
<code class="cpp">struct foo { bool operator () ( const bool & a ) { return a; } }; int main() { foo afoo; auto bar = [=] () -> bool { afoo(true); }; return 0; }</code>
L'erreur ici est que l'opérateur() de l'expression lambda est déclaré comme const en raison de la liste de capture [=] environnante. Pour résoudre ce problème, nous pouvons utiliser le mot-clé mutable. En ajoutant mutable à la liste de capture lambda, nous permettons au lambda de modifier les variables capturées, même celles capturées par valeur :
<code class="cpp">auto bar = [=] () mutable -> bool { afoo(true); };</code>
Cette modification rend l'opérateur () du lambda non const, nous permettant d'appeler le non -const Operator() de l'objet afoo.
Par conséquent, pour capturer par valeur dans une expression lambda et empêcher la valeur capturée d'être const, utilisez le mot-clé mutable dans la liste de capture. Cela permet au lambda de modifier la variable capturée sans provoquer d'erreurs de compilation.
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!