C ++ 0x лямбда-захват по значению всегда const?

103

Есть ли способ захватить по значению и сделать захваченное значение неконстантным? У меня есть функтор библиотеки, который я хотел бы захватить и вызвать метод, который не является константой, но должен быть.

Следующее не компилируется, но создание foo :: operator () const исправляет его.

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}
Зак
источник

Ответы:

167

Используйте изменчивый.


auto bar = [=] () mutable -> bool ....

Без mutable вы объявляете operator () лямбда-объекта const.

Эдвард Стрэндж
источник
-5

Есть альтернативный способ использования изменяемого (решение, предложенное Безумным Эдди).

С [=] ваш блок захватывает все объекты по значениям. Вы можете использовать [&] для захвата всех объектов по ссылке:

auto bar = [&] () -> bool

Или вы можете захватить по ссылке только определенный объект [=, & afoo] :

auto bar = [=, &afoo] () -> bool

Обратитесь к этой странице для получения подробной информации ( раздел пояснений ): http://en.cppreference.com/w/cpp/language/lambda

Влад
источник
11
Это делает совершенно разные вещи. Они не взаимозаменяемы. Это не отвечает на вопрос ОП.
Эдвард Стрэндж
1
Проблема этого решения заключается в том, что оно не работает для захваченных локальных переменных, уничтоженных до выполнения лямбда-выражения (например, когда вы запускаете отдельный std :: thread).
Саймон Нинон