Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Mirmik
techpriest
193 / 164 / 42
Регистрация: 27.02.2014
Сообщений: 863
#1

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

27.04.2016, 10:24. Просмотров 374. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача переменной в лямбда-функцию по значению (C++):

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

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

Передача параметров в функцию по значению, по ссылке или по указателю - C++
Передача параметров в функцию по значению, по ссылке или по указателю. Чем отличаются эти 3 способа. И, если не сложно, привести...

Передача аргумента в функцию по значению, по ссылке, по указателю: в чём концептуальная разница? - C++
Доброго всем здравия, прошу прощения, что достал уже всех этой темой. #include &lt;iostream&gt; using namespace std; int my_attemp(int...

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

Передача переменной в функцию - C++
Здравствуйте. Подскажите пожалуйста как сделать следующее: есть класс: #pragma once #include &quot;Point2d.h&quot; #include &lt;vector&gt; ...

5
rikimaru2013
C++ Game Dev
2443 / 1136 / 240
Регистрация: 30.11.2013
Сообщений: 3,696
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
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
27.04.2016, 11:30 #3
Передача по значению. Блямба функция обзаведется своей внетренней копией x, поэтому ни о каких локальных переменных здесь речи не идет. Впрочем rikimaru2013 привет хороший пример того, что примерно происходит.
0
Mirmik
techpriest
193 / 164 / 42
Регистрация: 27.02.2014
Сообщений: 863
27.04.2016, 12:33  [ТС] #4
Хорошо. Механизм понятен.

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

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

Добавлено через 21 минуту
То есть непонятно мне пока, что конкретно означает синтаксис [=].
0
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
193 / 164 / 42
Регистрация: 27.02.2014
Сообщений: 863
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
Привет! Вот еще темы с ответами:

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

Передача значения переменной-члена из класса в функцию - C++
Добрый день, имеется класс: class ZernPole{ public: ZernPole(int Zerno) { zpZerno=Zerno;...

Передача лямбда в функции - C++
В чем смысл передачи лямбда выражения функции?auto square = (int x) { return x * x; }; std::cout &lt;&lt; square(16) &lt;&lt; std::endl;илиclass Foo ...

Передача по значению - C++
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;conio.h&quot; #include &quot;locale&quot; using namespace::std; struct Distance { int...


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

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

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