Maison > développement back-end > C++ > 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
Libérer: 2024-10-23 18:23:01
original
815 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
    Copier après la connexion
  • 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>
    Copier après la connexion
  • 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>
    Copier après la connexion
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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal