Как возможно, что этот пример работает? Он печатает 6
:Где хранятся данные, сохраненные лямбдой?
#include <iostream>
#include <functional>
using namespace std;
void scopeIt(std::function<int()> &fun) {
int val = 6;
fun = [=](){return val;}; //<-- this
}
int main() {
std::function<int()> fun;
scopeIt(fun);
cout << fun();
return 0;
}
Где значение 6
сохраняется после того, как scopeIt
делается называться? Если я заменил [=]
на [&]
, он печатает 0
вместо 6
.
Просто догадка, поэтому это не отправлено как ответ: вы фиксируете переменную по значению, поэтому ее копируют в datamember функтора, который компилятор генерирует за кулисами (по крайней мере, так это то, как Скотт Майерс объясняет реализацию лямбда). Если вы сделаете запись по ссылке, член этого функтора будет ссылаться на то, что больше не существует. Может быть, UB, я не знаю. – JorenHeit
Некоторые особенности о лямбда, как указал Скотт Мейерс: http://youtu.be/48kP_Ssg2eY (ускоренная перемотка вперед до 16:42) – JorenHeit