использование вне области видимости переменных в лямбда-выражениях C ++ 11

Я играю с C ++ 11 для удовольствия. Мне интересно, почему это происходит:

//...
std::vector<P_EndPoint> agents;
P_CommunicationProtocol requestPacket;
//...
bool repeated = std::any_of(agents.begin(), agents.end(),
[](P_EndPoint i)->bool
{return requestPacket.identity().id()==i.id();});

Компиляция заканчивается с этой ошибкой:

error: 'requestPacket' has not been declared

Который объявлен ранее в коде. Я старался ::requestPacke и это тоже не сработало.

Как я могу использовать внешнюю переменную области видимости внутри лямбда-функции?

10

Решение

Вам нужно захватить переменную, либо по значению (используя [=] синтаксис)

bool repeated = std::any_of(agents.begin(), agents.end(),
[=](P_EndPoint i)->bool
{return requestPacket.identity().id()==i.id();});

или по ссылке (используя [&] синтаксис)

bool repeated = std::any_of(agents.begin(), agents.end(),
[&](P_EndPoint i)->bool
{return requestPacket.identity().id()==i.id();});

Обратите внимание, что, как указывает @aschepler, глобальные переменные со статической продолжительностью хранения не фиксируются, только переменные уровня функции:

#include <iostream>

auto const global = 0;

int main()
{
auto const local = 0;

auto lam1 = [](){ return global; }; // global is always seen
auto lam2 = [&](){ return local; }; // need to capture local

std::cout << lam1() << "\n";
std::cout << lam2() << "\n";
}
29

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector