С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Mirmik
techpriest
624 / 205 / 55
Регистрация: 27.02.2014
Сообщений: 1,088
1

Передача переменной в лямбда-функцию по значению

27.04.2016, 10:24. Просмотров 784. Ответов 5
Метки нет (Все метки)

Ребят!

А объясните, что тут происходит, позязя .

C++
1
2
3
4
5
6
7
8
9
function<int()> f() {
    int x = 0;
    return [=] () mutable {return ++x; };
}
 
auto fun = f();
for (int i = 0; i < 5; ++i) {
    cout << fun() << endl;
}
Я так понимаю, что мы создаём функцию, которая возвращает указатель на другую функцию, которая вызывается в цикле.
Интересуют два момента. Во первых, что значит
C++
1
[=]
А также, что меня более всего интересует, чем является
C++
1
int x = 0;
Это ведь локальная переменная, которая должна умереть после вызова f().
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2016, 10:24
Ответы с готовыми решениями:

Передача в функцию по значению
Добрый день. Ответьте мне пожалуйста вот на такой вопрос, читая книжку дошел...

Передача параметров в функцию по значению, по ссылке и по указателю
Доброе время суток товарищи программисты. Столкнулся с кучей ошибок в написании...

Передача параметров в функцию по значению, по ссылке или по указателю
Передача параметров в функцию по значению, по ссылке или по указателю. Чем...

Передача аргумента в функцию по значению, по ссылке, по указателю: в чём концептуальная разница?
Доброго всем здравия, прошу прощения, что достал уже всех этой темой. ...

Присваивание объектов одного типа между собой и передача объекта в функцию по значению
При первом знакомстве с С++ усиленно не могу понять вот такие моменты : 1....

5
rikimaru2013
C++ Game Dev
2473 / 1141 / 349
Регистрация: 30.11.2013
Сообщений: 3,709
27.04.2016, 10:47 2
Mirmik, а вот без лямбды ваш код -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <functional>
using namespace std;
 
class Anonym
{
private:
   int _x;
public:
   Anonym( int x ) :_x( x )
   {
   }
   int operator()()
   {
      return ++_x;
   }
};
int main( int argc, char* argv[] )
{
   int x = 0;
   Anonym lambda(x);
   
   for(int i = 0; i < 5; ++i)
   {
      cout << lambda() << endl;
   }
 
}
1
Ilot
Эксперт С++
1832 / 1190 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
27.04.2016, 11:30 3
Передача по значению. Блямба функция обзаведется своей внетренней копией x, поэтому ни о каких локальных переменных здесь речи не идет. Впрочем rikimaru2013 привет хороший пример того, что примерно происходит.
0
Mirmik
techpriest
624 / 205 / 55
Регистрация: 27.02.2014
Сообщений: 1,088
27.04.2016, 12:33  [ТС] 4
Хорошо. Механизм понятен.

А за что конкретно тут отвечает [=] ?
И чем оно отличается от [&x] ?

Скомпилировал, вижу, что отличается . Но что оно всё-таки конкретно значит.

Добавлено через 21 минуту
То есть непонятно мне пока, что конкретно означает синтаксис [=].
0
Ilot
Эксперт С++
1832 / 1190 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
27.04.2016, 12:35 5
Цитата Сообщение от Mirmik Посмотреть сообщение
А за что конкретно тут отвечает [=] ?
И чем оно отличается от [&x] ?
Указывает метод захвата внешней переменной. Знак & указание, что переменная будет захвачена по ссылке, а знак = по значению.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
int main() {
    int x = 0;
    int y = 0;
 
    auto f = [=] () mutable {
        ++x;
        ++y;
    };
    f();
    std::cout << "x = " << x << std::endl;
    std::cout << "y = " << y << std::endl;
 
    auto g = [&] {
        ++x;
        ++y;
    };
    g();
    std::cout << "x = " << x << std::endl;
    std::cout << "y = " << y << std::endl;
    return 0;
}
Причем в последнем случае для изменения внешней переменной следует указать в спецификации лямбда-функции ключевое слово mutable.
C++
1
2
3
4
    auto f = [&x, y] () mutable {
        ++x;
        ++y;//Переменную можно модифицировать.
    };
1
Mirmik
techpriest
624 / 205 / 55
Регистрация: 27.02.2014
Сообщений: 1,088
27.04.2016, 13:04  [ТС] 6
Хм.... А я правильно понимаю, что при замыкании по значению лямбда всегда таскает с собой контекст?
То есть лямбда... по сути функтор?

Добавлено через 5 минут
И под лямбду всегда создаётся новый класс....
0
27.04.2016, 13:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2016, 13:04

Передача переменной в функцию
Здравствуйте. Подскажите пожалуйста как сделать следующее: есть класс:...

Передача переменной из функции в функцию
#include &lt;iostream&gt; #include &lt;fstream&gt; // работа с файлами #include &lt;iomanip&gt;...

Передача значения переменной-члена из класса в функцию
Добрый день, имеется класс: class ZernPole{ ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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