#c #lambda #capture
#c #лямбда #захват
Вопрос:
Мне было интересно, могу ли я записать результат функции:
int main()
{
struct A { int a; int func() { return a; } };
A a;
auto lambda = []() {};
// I WANT THE LAMBDA TO HAVE A COPY OF a.func();
// In other words I want capture the return value of a.func()
}
Есть ли способ сделать это? Я знаю, что в более новых стандартах C вы можете создавать новые переменные в списке захвата, так что что-то вроде этого?
auto lambda = [int copy = a.func()] () { cout << copy; }
Комментарии:
1. … да? Вы можете сделать именно это. Но удалите слово
int
Ответ №1:
Синтаксис немного отличается. Тип объекта в группе захвата выводится из инициализатора, и вы не можете явно указать тип:
auto lambda = [copy = a.func()] () { std::cout << copy; };
// ^ no int
Вы также можете создать несколько объектов разных типов в группе захвата, если вы просто разделите их на ,
:
auto lambda = [x = a.func(), y = a.func2()] () { std::cout << x << y; };
Вот демонстрация.
Комментарии:
1. Неплохо. И для нескольких переменных? Можете ли вы выполнить [a = a.func(), b = a.func2()] () { } ??? Я разделил его запятой…
2. @Рыбка Данио да, вы можете. См . Лямбда-выражения на cppreference.com : » захваты — разделенный запятыми список из нуля или более захватов, необязательно начинающийся с захвата по умолчанию».