2015-05-13 7 views
23

Próbuję podążać za this example, aby użyć lambda z remove_if. Oto moja próba:Błąd: zmienna "nie może zostać niejawnie przechwycona, ponieważ nie określono domyślnego trybu przechwytywania"

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

ale ten nie trafia do kompilacji:

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

Jak mogę to parametr zewnątrz, flagId w wyrażeniu lambda?

+3

Domyślne tryby przechwytywania to '[=]' (według wartości) i '[&]' (przez odniesienie). '[]' oznacza brak przechwytywania. – MSalters

Odpowiedz

46

Musisz określić, aby przechwycić flagId. Po to jest część []. W tej chwili nic nie przechwytuje. Możesz przechwycić (more info) według wartości lub jako odniesienie. Coś jak:

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

Który przechwytuje przez odniesienie. Jeśli chcesz, aby uchwycić przez wartość const, można to zrobić:

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

Lub wartości zmienny:

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

Niestety nie ma prostego sposobu na zdobycie przez const odniesienia. Osobiście po prostu zadeklarowałbym tymczasowy const ref i uchwycił to przez ref:

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 
Powiązane problemy