C ++ 0x захоплення лямбда за значенням завжди const?


102

Чи є спосіб зафіксувати значення і зробити захоплене значення не const? У мене є функціонер бібліотеки, який я хотів би захопити і викликати метод, який не є 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;
}

Відповіді:


165

Використовуйте змінні.


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

Не змінюючи, ви оголошуєте оператора () лямбда-об'єкта const.


-5

Існує альтернативний спосіб використання змінних (рішення, запропоноване Crazy Eddie).

З допомогою [=] ваш блок фіксує всі об'єкти за значеннями. Ви можете використовувати [&] для зйомки всіх об'єктів за посиланням:

auto bar = [&] () -> bool

Або ви можете захоплювати посиланням лише певний об'єкт [=, & afoo] :

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

Детальні відомості див. На цій сторінці ( розділ Пояснення ): http://en.cppreference.com/w/cpp/language/lambda


11
Це робить зовсім інші речі. Вони не взаємозамінні. Це не відповідає на питання ОП.
Edward Strange

1
Проблема цього рішення полягає в тому, що воно не працює для захоплених локальних змінних, зруйнованих до виконання лямбда (наприклад, коли ви запускаєте відокремлений нитку std ::).
Саймон Нінон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.