Capture Lambda par valeur toujours constante en C 0x ?
Ce problème survient lorsque vous tentez de capturer une valeur par référence mais modifiez son contenu dans une expression lambda. Le compilateur traite les valeurs capturées comme des constantes par défaut, garantissant qu'elles restent inchangées. Cependant, certains scénarios peuvent nécessiter un accès non constant aux valeurs capturées.
Comprendre la capture par valeur :
En C 0x, les fonctions lambda peuvent capturer des variables par valeur ou par référence. Lors de la capture par valeur, une copie de la variable est créée dans la portée du lambda, permettant une modification au sein du lambda. Cependant, par défaut, les copies capturées sont traitées comme constantes, empêchant leur modification.
Mot-clé mutable à la rescousse :
Pour surmonter cette limitation, le mot-clé mutable peut être utilisé. En ajoutant mutable à la liste des paramètres d'un lambda, nous déclarons explicitement la valeur capturée comme modifiable dans la portée du lambda. Cela permet un accès non const à la valeur capturée, résolvant ainsi le problème décrit dans l'extrait de code fourni.
Exemple :
Considérez le code suivant qui tente de capturer une valeur par référence et appelle un non-const méthode :
struct foo
{
bool Operator () ( const bool & a )
{
return a;
}
};
int main()
{
foo afoo;
auto bar = [=] () -> bool
{ afoo(true); };
return 0;
}
Dans ce code, créer foo::operator() const résout le problème de compilation. Cependant, l'utilisation de mutable directement dans l'expression lambda offre une plus grande flexibilité et permet un accès non constant à la valeur capturée sans modifier la déclaration d'origine
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!