web-dev-qa-db-fra.com

Erreur: la variable "ne peut pas être capturée implicitement car aucun mode de capture par défaut n'a été spécifié"

J'essaie de suivre cet exemple d'utiliser un lambda avec remove_if. Voici ma tentative:

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());

mais cela ne compile pas:

error C3493: 'flagId' cannot be implicitly captured because no default capture mode has been specified

Comment puis-je inclure le paramètre extérieur, flagId, dans l'expression lambda?

44
user63898

Vous devez spécifier flagId à capturer. C'est ce que le [] partie est pour. Pour l'instant, il ne capture rien. Vous pouvez capturer ( plus d'infos ) par valeur ou par référence. Quelque chose comme:

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [&flagId](Flag& device)
    { return device.getId() == flagId; });

Qui capture par référence. Si vous voulez capturer par valeur const, vous pouvez faire ceci:

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [flagId](Flag& device)
    { return device.getId() == flagId; });

Ou par valeur mutable:

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [flagId](Flag& device) mutable
    { return device.getId() == flagId; });

Malheureusement, il n’existe aucun moyen simple de capturer par référence constante. Personnellement, je voudrais simplement déclarer une référence permanente temporaire et la capturer par la référence suivante:

const auto& tmp = flagId;
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
            [&tmp](Flag& device)
        { return device.getId() == tmp; }); //tmp is immutable
80
AndyG