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

Лямбды - C++

Восстановить пароль Регистрация
 
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
02.11.2012, 23:04     Лямбды #1
Непонятно, как работает это простенький код, и почему именно так:

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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.11.2012, 23:48     Лямбды #4
Потому что первые три раза выводится значение той id, что сохранена внутри f(). Оно же и увеличивается самой f() при её вызове. А в четвёртый раз выводится значение локальной переменной id той функции, где это всё происходит. Она не связана с той id, которая внутри f().
Герц
523 / 340 / 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 во внешней области осуществляется по значению. Что там сохраняется?
Герц
523 / 340 / 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
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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++ Тело лямбды. Двумерный массив

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

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

Текущее время: 18:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru