Копирование объекта в лямбда-захват [дубликат]

Разница между расширением потока и реализацией Runnable:

12
задан Radioga 21 August 2016 в 14:20
поделиться

2 ответа

Если вы сделаете захват по значению в лямбда, вы получите «член», который будет сохранен. Поскольку по умолчанию operator() является функцией const, вы не можете их изменять.

Lambdas может быть определен как []() mutable {}, чтобы вы могли изменять локальные переменные.

значение по ссылке, у вас есть что-то, что ведет себя как указатель const к объекту non-const, поэтому без изменчивого вы можете адаптировать эти объекты. (Если они уже не существуют)

12
ответ дан JVApen 17 August 2018 в 09:57
поделиться
  • 1
    Плюс один, потому что вы проиллюстрируете настоящую причину: то есть, захваченные значениями копирования не сохраняются как const, а скорее вызов operator() является функцией const-члена, если только lambda не определен как mutable. – 101010 21 August 2016 в 14:09

Захваченные переменные действительно const в области lamba:

[foo]()
{
   // foo, whatever that is, is const
}

В изменяемой лямбда захваченные переменные не являются константами:

[foo]()
mutable {

   // Lambda can modify foo, but it's a copy of the original
   // captured variable
}
8
ответ дан Sam Varshavchik 17 August 2018 в 09:57
поделиться
  • 1
    Стоит отметить, что объект, скопированный там (матрица OpenCV), является общим указателем на фактические данные. Измененная лямбда по-прежнему будет изменять базовые данные. – Sam 21 August 2016 в 17:59
Другие вопросы по тегам:

Похожие вопросы: