Maison  >  Article  >  développement back-end  >  Comment capturer explicitement des variables dans les fonctions Lambda pour résoudre les erreurs de compilation ?

Comment capturer explicitement des variables dans les fonctions Lambda pour résoudre les erreurs de compilation ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-23 18:23:01737parcourir

How to Explicitly Capture Variables in Lambda Functions to Resolve Compilation Errors?

Capture de variables dans les fonctions Lambda

Lors de l'utilisation d'expressions lambda dans des appels de fonction, la capture des variables de la portée englobante est essentielle. Dans ce contexte, l'incapacité de capturer implicitement des variables peut conduire à des erreurs de compilation, comme la fameuse « erreur C3493 : 'la variable "ne peut pas être implicitement capturée...""

Considérez l'extrait de code suivant :

<code class="cpp">int flagId = _ChildToRemove->getId();
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [](Flag& device) { return device.getId() == flagId; });

m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end());</code>

Ce code tente de supprimer un élément d'un vecteur en C à l'aide d'une fonction lambda. La lambda compare le champ ID de chaque appareil dans le vecteur m_FinalFlagsVec à une variable externe flagId, l'ID de l'appareil à utiliser. supprimé.

Cependant, le compilateur génère l'erreur susmentionnée, indiquant que la variable flagId n'est pas incluse dans la liste de capture du lambda. Pour résoudre ce problème, nous devons spécifier explicitement les variables à capturer dans la portée englobante.

<code class="cpp">[flagId](Flag& device)
{
    return device.getId() == flagId;
}</code>

En incluant flagId dans la liste de capture, nous indiquons que le lambda accédera à la variable flagId depuis la portée englobante :

  • <.>Par valeur : La variable est copiée dans la fermeture du lambda, la rendant immuable au sein du lambda.

    <code class="cpp">[flagId = std::as_const(flagId)](Flag& device)
    {
      // flagId is immutable within the lambda
    }</code>
  • Par référence : La variable est directement référencé dans le lambda, permettant la modification.

    <code class="cpp">[&flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
  • Par référence mutable : Similaire à la capture par référence, mais permet au lambda de modifier le capturé variable.

    <code class="cpp">[mutable flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
La sélection du mode de capture approprié dépend des exigences spécifiques de la fonction lambda. En capturant explicitement les variables de la portée englobante, les développeurs peuvent traiter efficacement les données dans les expressions lambda, garantissant ainsi que leur code reste fonctionnel et sans bug.

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