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

Насколько корректно будет работать замыкание? - C++

Восстановить пароль Регистрация
 
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
19.11.2013, 18:20     Насколько корректно будет работать замыкание? #1
Мой друг-JS'ер бросил мне очередной челлендж. В этот раз он мне предложил сделать замыкание для a*x+y
На JS
Javascript
1
2
3
4
5
6
7
8
9
function line(k,b){
  return function(x) {
    return k*x+b;
  }
}
 
var a = line(2,7),    // function(x) { return 2*x + 7; }
    b = line(3,2),    // function(x) { return 3*x + 2; }
    c = line(7,-2);   // function(x) { return 7*x - 2; }

Вроде как-бы я сделал, но не уверен, всегда ли будет корректно работать следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
auto func(int a, int b){
    return [a, b](int x)->int{
        return a*x+b;
    };
}
 
 
 
int main()
{
    auto t = func(0, 2);
    cout << t(3) << endl;
    return 0;
}
Тобишь всегда-ли будет доступ к переменным a и b у функции t()? Может ли случиться такое, что переменные "потеряются" в памяти?

Добавлено через 1 минуту
Тобишь в данном случае он будет работать правильно. Но всегда ли так будет?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 18:22     Насколько корректно будет работать замыкание? #2
Не потеряются. Там идет захват по значению. Значит они будут просто скопированы
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
19.11.2013, 18:22  [ТС]     Насколько корректно будет работать замыкание? #3
I.M., благодарю, именно это я и хотел услышать
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 18:25     Насколько корректно будет работать замыкание? #4
Цитата Сообщение от MastAKK Посмотреть сообщение
auto func(int a, int b){
А смысл выводить тип фиксированного выражения от фиксированных типов? Уж проще написать
C++
1
int func(int a, int b)
.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 18:26     Насколько корректно будет работать замыкание? #5
taras atavin, а там не int возвращается, а std::function<int(int)>
Ну не обязательно именно этот тип, но приводимый к нему
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
19.11.2013, 18:27  [ТС]     Насколько корректно будет работать замыкание? #6
taras atavin, auto тут потому, что мне было лень писать (см. выше что). А так компилятор все прекрасно понял. Тип возвращаемого значения тут НЕ int
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 18:40     Насколько корректно будет работать замыкание? #7
Цитата Сообщение от I.M. Посмотреть сообщение
taras atavin, а там не int возвращается, а std::function<int(int)>
Ну не обязательно именно этот тип, но приводимый к нему
Входные данные имеют фиксированный тип, операции с ними и порядок этих операций совпадает, значит и тип значения фиксирован. Ни int? Эйси.
C++
1
2
3
4
func (int x, int y)
{
 return (float)x/(float)y;
}
должна быть
C++
1
float func (int x, int y)
. Но это фиксированный тип, хоть и не int. Выводить имеет смысл, когда типы исходных данных имеют множество сочетаний, а каждое вручную анализировать не охота. А здесь выбор типа занимает меньше времени, чем набор auto.

Добавлено через 1 минуту
Цитата Сообщение от MastAKK Посмотреть сообщение
Тип возвращаемого значения тут НЕ int
Где у меня утверждение, что это int? Это тип однозначно связанный с int и алгоритмом, в котором этот int участвует.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 18:40     Насколько корректно будет работать замыкание? #8
Еще раз. Там возвращается лямбда
C++
1
[a, b](int x)->int{return a*x+b;};
Видимо, так было написать короче
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 18:42     Насколько корректно будет работать замыкание? #9
Цитата Сообщение от I.M. Посмотреть сообщение
Еще раз. Там возвращается лямбда
Код C++
1
[a, b](int x)->int{return a*x+b;};
это не int
Ещё раз. Где я утверждаю, что там int?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 21:39     Насколько корректно будет работать замыкание?
Еще ссылки по теме:

C++ Будет ли работать данная конструкция?
C++ Корректно ли будет работать функция realloc в пользовательском классе массива
C++ Будет ли работать такой способ получения псевдослучайного числа?

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

Или воспользуйтесь поиском по форуму:
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
19.11.2013, 21:39  [ТС]     Насколько корректно будет работать замыкание? #10
taras atavin, я вообще не понимаю, о чем вы. Там тип возвращаемого значения (без auto):
C++
1
std::function<int(int)> func(int x, int y)
если не ошибаюсь

Добавлено через 24 секунды

Не по теме:

Если вопрос в том, зачем - то ответ просто: наспор, чтобы доказать мощь C++11

Yandex
Объявления
19.11.2013, 21:39     Насколько корректно будет работать замыкание?
Ответ Создать тему
Опции темы

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