Подтвердить что ты не робот

Ошибка: переменная "не может быть неявно зафиксирована, потому что не указан режим захвата по умолчанию"

Я пытаюсь выполнить этот пример, чтобы использовать лямбда с remove_if. Вот моя попытка:

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

но это не скомпилируется:

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

Как включить внешний параметр flagId в выражение лямбда?

4b9b3361

Ответ 1

Вы должны указать flagId для записи. Для этого предназначена часть []. Сейчас он ничего не фиксирует. Вы можете захватить (подробнее) по значению или по ссылке. Что-то вроде:

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

Что фиксируется по ссылке. Если вы хотите захватить значение const, вы можете сделать это:

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

Или изменяемым значением:

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

К сожалению, нет простого способа захвата с помощью ссылки const. Я лично просто объявлял бы временный const 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