Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
#1

Лямбды - C++

02.11.2012, 23:04. Просмотров 593. Ответов 10
Метки нет (Все метки)

Непонятно, как работает это простенький код, и почему именно так:

C++
1
2
3
4
5
6
7
8
9
10
int id = 0;
 
auto f = [id] () mutable { cout << "id: " << id << std::endl; ++id; };
 
id = 42;
f();
f();
f();
 
cout << id << std::endl;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2012, 23:04     Лямбды
Посмотрите здесь:

Не компилится из-за лямбды - C++
void Chair::wait_invite(const int &amp;id_client) { unique_lock &lt;mutex&gt; lk(mx_chair); cond_invite.wait(mx_chair, { return...

Модификация внутренней переменной лямбды - C++
Добрый вечер, что-то помню, что-то всплывает перед глазами в качестве кода - но не могу подобрать запрос в гугле, чтобы найти то о чём...

Можно ли писать вложенные лямбды? (с++11) - C++
Можно ли писать вложенные лямбды? Вот такая конструкция server.exec( ( Socket *sock ){ Client client( sock ); sock-&gt;recv( (...

Допускается ли такое использование лямбды - C++
Имеется код #include &lt;iostream&gt; using namespace std; int main() { cout &lt;&lt; ()-&gt;float{return 9.4;}; return 0; ...

Лямбды в списке инициализации членов - C++
Возможно ли такое? Сейчас времени нет пробовать, если кто-то объяснит или ссылочку на стандарт приведет буду благодарен.

Тело лямбды. Двумерный массив - C++
Здравствуйте. Возник вопрос, при попытке реализации примитивнейшей программы. &quot;Требуется {, вводящая тело лямбды&quot;. Что это значит? ...

Как вернуть значение лямбды? - C++
int someFunc() { return () -&gt; int {return 1;}; // не работает. Как возвращать такие штуки? }

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.11.2012, 23:27     Лямбды #2
Есть замыкание f(): функция и её захваченное окружение. В данном случае это окружение состоит из переменной id.

Внутри этого замыкания хранится код функции и личная копия значения переменной id, которой и будет пользоваться этот код, когда внутри него обращаются к переменной с именем id безо всяких квалификаторов.

Можете понимать
C++
1
auto f = [id] () mutable { cout << "id: " << id << std::endl; ++id; };
как
C++
1
2
3
4
5
6
7
8
9
// генерируется автомагически, пользователю недоступно
class closure438517 {
    int id;
public:
    closure438517(int id) : id(id) {}
    void operator()() { cout << "id: " << id << std::endl; ++id; }
};
 
auto f = closure438517(id);
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
02.11.2012, 23:45  [ТС]     Лямбды #3
Да непонятно, почему вывод от этого кода вот такой:

C++
1
2
3
4
id: 0
id: 1
id: 2
42
Мне казалось, что он должен быть таким

C++
1
2
3
4
id: 42
id: 43
id: 44
45
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.11.2012, 23:48     Лямбды #4
Потому что первые три раза выводится значение той id, что сохранена внутри f(). Оно же и увеличивается самой f() при её вызове. А в четвёртый раз выводится значение локальной переменной id той функции, где это всё происходит. Она не связана с той id, которая внутри f().
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.11.2012, 23:53     Лямбды #5
Захвати id по ссылке, используя [&id].
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
02.11.2012, 23:54  [ТС]     Лямбды #6
ЧТо значит сохранена.
Запись в квадратных скобках означает, что доступ к id во внешней области осуществляется по значению. Что там сохраняется?
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.11.2012, 23:57     Лямбды #7
По значению. А ты когда в функцию по значению что-то передаешь, она разве получает те изменения, которые были совершены после передачи параметра по значению?
В замыкании хранится копия переменной id со значением на момент создания замыкания.
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
03.11.2012, 00:27  [ТС]     Лямбды #8
После нет, а во вреемя работы функции - да.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.11.2012, 00:54     Лямбды #9
Ну вот тут то же самое. Только изменения сохраняются ещё и между вызовами функций.
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
03.11.2012, 01:01  [ТС]     Лямбды #10
Я просто считаю, что первое объявление, оно просто как объявление, но из ваших с Герцем объяснений, я так понял, что это не совсем правильно. Что это не только объявление, но и еще и захват значения некоторой внешней переменной на момент написания этого объявления.

Правильно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2012, 01:31     Лямбды
Еще ссылки по теме:

Накладные расходы при создании лямбды - C++
Имеет смысл создавать лямбда функцию таким образом: static const auto lam = (){ /* много строк */ }; Получается так она разместится в...

Как создать псевдоним для лямбды? - C++
ПРИВЕТ. не поможете ли советом, как решить проблему: хочу дать имя классу лямбды, но чето не выходит using PREDICATE = (const...

Захват const переменной из лямбды: разный результат в g++ и clang - C++
Добрый день. #include &lt;iostream&gt; template &lt;class T&gt; void foo(const T&amp; t) { const int a = t; { ...

Прокомментировать код функций, генерирующих другие функции (лямбды) - C++
В функциональном программировании функции могут возвращать другие функции. Корректно ли делать это в C++ так, как показано ниже?...

лямбды - Python
Необходимо определить функции так, чтобы проходили доктесты. Используй лямбды, а не вложенные функции. Каждое решение должно состоять из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.11.2012, 01:31     Лямбды #11
Именно.
Yandex
Объявления
03.11.2012, 01:31     Лямбды
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru