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

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

Следующее не компилируется, но 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;
}

Ответ 1

Использовать mutable.


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

Без изменчивости вы объявляете оператор() объекта лямбда const.

Ответ 2

Существует альтернативный способ использования изменчивого (решение, предложенное Crazy Eddie).

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

auto bar = [&] () -> bool

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

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

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