Почему лямбды могут захватывать только локальные переменные?
От:
enji
Дата: 25.07.13 14:41
Оценка:
Неудобно же
struct T {
int a, b;
void f() {
int a = this ->a, b = this ->b;
[a, b](){a+b;};
}
};
Re: Почему лямбды могут захватывать только локальные переменные?
Здравствуйте, enji, Вы писали:
E>Неудобно же
А ты this не пробовал пробрасывать в качестве контекста?
Re[2]: Почему лямбды могут захватывать только локальные переменные?
От:
Кодт
Дата: 25.07.13 15:34
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
АШ>А ты this не пробовал пробрасывать в качестве контекста?
А у this поверхностное копирование, члены будут как по ссылке. Замыкание на сторону отдавать — печально.
Перекуём баги на фичи!
Re[2]: Почему лямбды могут захватывать только локальные переменные?
От:
enji
Дата: 25.07.13 15:48
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Здравствуйте, enji, Вы писали:
E>>Неудобно же
АШ>А ты this не пробовал пробрасывать в качестве контекста?
Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект
Re[3]: Почему лямбды могут захватывать только локальные переменные?
Здравствуйте, enji, Вы писали:
E>Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект
А иногда нужно move-нуть в лямбду — сейчас нужно делать bind и вырисовывать тип/decltype в параметре лямбды:
vector<int > x(1 << 20);
bind([](decltype(x) &y)
{
y.clear();
}, move(x))();
В C++14 будут generalized lambda-capture — если чего-то не хватает, можно сейчас попробовать за-proposal'ить
Re[3]: Почему лямбды могут захватывать только локальные переменные?
От:
Шахтер
Дата: 25.07.13 16:05
Оценка:
Здравствуйте, enji, Вы писали:
E>Здравствуйте, Анатолий Широков, Вы писали:
АШ>>Здравствуйте, enji, Вы писали:
E>>>Неудобно же
АШ>>А ты this не пробовал пробрасывать в качестве контекста?
E>Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект
template <class T>
void Call(T func)
{
func();
}
struct Temp
{
int a,b;
void test()
{
Call( [=] () { return a+b; } );
}
};
В XXI век с
CCore .
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[4]: Почему лямбды могут захватывать только локальные переменные?
Здравствуйте, Шахтер, Вы писали:
E>>Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект
Ш>Ш> void test()
Ш> {
Ш> Call( [=] () { return a+b; } );
Ш> }
Ш>
#include <functional>
#include <iostream>
using namespace std;
struct Gadget
{
void operator ()(){}
~Gadget(){ cout << "~" << endl; }
};
struct Widget
{
Gadget x;
function<void ()> operator ()()
{
return [=]{ x(); cout << "lambda" << endl; };
}
};
int main()
{
auto &&x = Widget{}();
x();
}
Вывод :
~
lambda
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить