Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> способ применения User-defined Literals? 
V
    Опции темы
mes
Дата 9.11.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  9.11.2011,  21:12 Найти цитируемый пост)
если переменная попадает в список захвата

newbee, а если захваченная  переменная  это ссылка,  то что с ней делать ? куда лепить подсчет ?

Это сообщение отредактировал(а) mes - 9.11.2011, 22:38


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 9.11.2011, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



или я чего-то не понимаю, или лямбда таки говорит компилятору не разрушать объекты на стеке?
Код

#include <functional>
#include <iostream>

struct two_lm{
   std::function<int(int)>
      l1
     ,l2;
};

two_lm foo(){
   int xx=42;
   std::cout << "1. &xx = " << &xx << std::endl;
   two_lm tt;
   tt.l1=[&xx](int a) { 
      std::cout << "2. &xx = " << &xx << std::endl;
      xx+=a;
      return xx;
   };
   tt.l2=[&xx](int a) {
      std::cout << "3. &xx = " << &xx << std::endl;
      return xx;
   };
   return tt;
}

int main() {
   two_lm lm=foo();
   std::cout<<lm.l2(0)<<std::endl;
   lm.l1(-2);
   std::cout<<lm.l2(0)<<std::endl;
}


http://liveworkspace.org/code/c3dfe28c7e25...7b160ded7607854
вывод:
Цитата

1. &xx = 0xbfbdfd74
3. &xx = 0xbfbdfd74
0
2. &xx = 0xbfbdfd74
3. &xx = 0xbfbdfd74
0



Добавлено через 2 минуты и 41 секунду
Цитата(mes @  9.11.2011,  22:37 Найти цитируемый пост)
а если захваченная  переменная  это ссылка,  то что с ней делать ?

инкрементировать счетчик ссылок оригинальной переменной. или что?

Это сообщение отредактировал(а) boostcoder - 9.11.2011, 22:41
PM WWW   Вверх
mes
Дата 9.11.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  9.11.2011,  21:40 Найти цитируемый пост)
вывод:

 smile какая связь между выводом адреса переменной и сохранностью стека ?!



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 9.11.2011, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  9.11.2011,  22:45 Найти цитируемый пост)
 какая связь между выводом адреса переменной и сохранностью стека ?!

а епс.. спать-спать-спать..
PM WWW   Вверх
mes
Дата 9.11.2011, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  9.11.2011,  21:40 Найти цитируемый пост)
инкрементировать счетчик ссылок оригинальной переменной. или что?

вот мне и интересно как  newbee это представляет smile



--------------------
PM MAIL WWW   Вверх
newbee
Дата 9.11.2011, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  9.11.2011,  23:37 Найти цитируемый пост)
newbee, а если захваченная  переменная  это ссылка,  то что с ней делать ? куда лепить подсчет ?
А что мешает разместить ссылку в создаваемом контексте? Ссылка на локальную переменную функции? Ну можно, как сейчас при возврате такой ссылки, писать ворнинг и падать в рантайме, можно и саму переменную утащить в контекст, наверное... Я не вижу принципиальных технических преград.


--------------------
You're face to face
With man who sold the world
PM   Вверх
bsa
Дата 9.11.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Имхо, в принципе логично, что возникает UB при использовании лямбдами локальных переменных функции после выхода из этой функции. Но, блин, какого хрена городить огород, который может приводить к UB?!?
Имхо, вектор развития С++ ведет к тому, что в какой-то момент, тим-лидеры будут радикально ограничивать список доступных группе функций языка, так как 80% программеров не будут знать более 80% свойств языка (числа взяты от балды)... А может в какой-то момент начнется массовая смена языка для новых проектов (хотя, вроде уже сейчас что-то в этом духе идет).

Добавлено через 7 минут и 12 секунд
Цитата(newbee @  10.11.2011,  00:00 Найти цитируемый пост)
А что мешает разместить ссылку в создаваемом контексте? Ссылка на локальную переменную функции? Ну можно, как сейчас при возврате такой ссылки, писать ворнинг и падать в рантайме, можно и саму переменную утащить в контекст, наверное... Я не вижу принципиальных технических преград. 

Имхо, это все выходит за рамки допустимого для С++. Слишком много сложных действий (причем не очевидных), которые пользователь (читай разработчик) совсем не ожидает. Например, твой подход предполагает выделение в куче контекста и создание умного указателя на него. А если у меня оператор new не работает или им пользоваться нельзя (программа для микроконтроллера, например)? Программист совсем не в курсе, что создание лямбда-функции вызовет такие "подводные" действия. Конечно, это можно прописать в учебниках и стандарте БОЛЬШИМИ КРАСНЫМИ буквами, но, есть подозрение, что книжки читают только тогда, когда все остальные методы оказались бессильны.
С другой стороны, текущее поведение тоже не является чем-то правильным. Зато не нарушает идеологию - если не заказывал функциональность, то и не получишь.
PM   Вверх
mes
Дата 9.11.2011, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  9.11.2011,  22:00 Найти цитируемый пост)
 Ссылка на локальную переменную функции?

ссылка может быть на что угодно, и переедана откуда угодно smile

Добавлено через 1 минуту и 4 секунды
Цитата(newbee @  9.11.2011,  22:00 Найти цитируемый пост)
Я не вижу принципиальных технических преград. 

вы предлагаете усложнить еще, не получая никакой выгоды взамен..



--------------------
PM MAIL WWW   Вверх
newbee
Дата 9.11.2011, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(bsa @  10.11.2011,  00:04 Найти цитируемый пост)
А если у меня оператор new не работает или им пользоваться нельзя (программа для микроконтроллера, например)?
Тогда у тебя и лямбды не будет или она не будет работать или будет работать с ограничениями, как сейчас. Про оператор new разработчик ведь откуда-то знает, и про это узнает. В любом случае это будет уже не стандартный С++, а какой-то диалект.

Добавлено через 4 минуты и 16 секунд
Цитата(mes @  10.11.2011,  00:20 Найти цитируемый пост)
ссылка может быть на что угодно, и переедана откуда угодно
Ну и? Пихаем ссылку в контест, где проблема?

Цитата(mes @  10.11.2011,  00:20 Найти цитируемый пост)
вы предлагаете усложнить еще, не получая никакой выгоды взамен..
Я предлагаю сделать семантику замыкания такой, какая она есть в большинстве языков. Выгоды с этого вагон, это настоящее расширение парадигм С++.


--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 9.11.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  9.11.2011,  22:25 Найти цитируемый пост)
Я предлагаю сделать семантику замыкания такой, какая она есть в большинстве языков.

так я не против, только надо тогда и все остальное  делать как в других языках..правда это уже будет совсем не С++ smile

Добавлено через 2 минуты и 43 секунды
Цитата(newbee @  9.11.2011,  22:25 Найти цитируемый пост)
Ну и? Пихаем ссылку в контест, где проблема?

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



--------------------
PM MAIL WWW   Вверх
newbee
Дата 9.11.2011, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  10.11.2011,  00:32 Найти цитируемый пост)
так я не против, только надо тогда и все остальное  делать как в других языках..правда это уже будет совсем не С++
Ну все, это уже пустое словоблудие пошло. Кто предлагает тащить все из других языков в С++? Я вообще за то, чтобы он оставался в рамках 2003 стандарта. Но в него тащат, это факт. Тащат неуклюже. Семантика функций в большинстве языков одинаковая. Классов, циклов, условий - тоже. Так если в С++ притащили лямбду с замыканием, почему их семантика кривая и вообще ни на что не похожая? Зачем эта калека в языке? Это были риторические вопросы, можешь не пытаться на них отвечать. Все, чао!

Добавлено через 3 минуты и 46 секунд
Цитата(mes @  10.11.2011,  00:32 Найти цитируемый пост)

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

Код

 int *a=new int;
 int &b=*a;
 b=5;
 delete a;
 b=10;

На, то же самое, но руками. Код может быть в произвольном порядке разбросан где угодно. Если программист ССЗБ и замыкает ссылки, пусть будет готов к веселой отладке.


--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 10.11.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  9.11.2011,  22:42 Найти цитируемый пост)
 Я вообще за то, чтобы он оставался в рамках 2003 стандарта. 

чтоб его побыстрее все бросили ? smile  а что ж не за то, чтоб С++ оставался в рамка "С с классами"..  (ага , есть и такие)

Цитата(newbee @  9.11.2011,  22:42 Найти цитируемый пост)
Зачем эта калека в языке

измени лозунг на "зачем этот калека среди языков" и вступай в ряды под эгидой kemmisto  smile 

Цитата(newbee @  9.11.2011,  22:42 Найти цитируемый пост)
 ССЗБ 

да все в этом языке так.. и лямбдами делу не поможешь.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 10.11.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



по правде сказать, мне с++ нравится почти всем. нет, есть конечно неприятные мелочи. но они настолько незначительны, что на них не стОит обращать внимания.
и такое мнение у меня не из-за того, что я пишу только на с/с++. я пишу и на пайтоне. и если нет категорических требований о том, что задача должна быть реализована исключительно средствами пайтона, то я всю логику пишу на с/с++ и выношу ее в .dll/.so при помощи boost.python, из из пайтона работаю с ней.
нет, конечно, бывают дико скучные задачи, которые хочется за###кодить как можно быстрей. ГУЙ на пример. в таких случаях лучше это делать на более подходящем для этого ЯП.

Up.
кстати пайтоновские лямбды тоже ругают за ограничение в одну строку кода.

Добавлено @ 00:23
тема превратилась в сплошной оффтопик.
по сабжу, будут идеи?
Цитата(boostcoder @  9.11.2011,  13:32 Найти цитируемый пост)

вопрос первый - что я не правильно делаю?
второй вопрос - что с этим делать, и как применять?
третий - какого типа являются объекты/переменные(?) _degrees/_func1/_var_string?



Это сообщение отредактировал(а) boostcoder - 10.11.2011, 00:40
PM WWW   Вверх
baldina
Дата 10.11.2011, 01:49 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(bsa @  9.11.2011,  23:04 Найти цитируемый пост)
 вектор развития С++ ведет к тому

в PL-образный монстр он врядли превратится. хотя тенденция - да, нехорошая


Цитата(newbee @  9.11.2011,  19:02 Найти цитируемый пост)
Если я ничего не напутала, это какие-то неуклюжие, неполноценные и вообще бесполезные замыкания, работающие на стеке.

newbee, в С++ сборки мусора нет, поэтому использовать (замкнутую) переменную вне ее контекста нельзя: нет простых методов для реализации такого функционала.
насколько мне известно, комитет по стандартизации подходит к новшествам с позиции "нельзя ли это сделать имеющимися средствами", синтаксический сахар это не путь С++. путь С++ - создавать синтаксический сахар имеющимися средствами в рамках существующего синтаксиса, т.е. перегрузкой операций и метапрограммированием.
что касается замыканий, они реализуются функциональными объектами, основной недостаток которых - необходимость много писать (причем задолго до места использования)
что касается лямбда-выражений (заметьте, они не называются лямбда-функциями), они функциональными объектами не являются и заменяют последние в подходящем контексте (типа for_each), обеспечивая более короткую и понятную запись. они, понятно, имеют свои недостатки.
на специализированном функциональном языке конечно все это гораздо стройней и изящнее, но за изящество приходится платить.

Добавлено через 6 минут и 31 секунду
кстати, пример Ваш с struct two_lm нехорош. концептуально нехорош. в этом примере правильно использовать функциональный объект, а идеологическая ниша лямбды - автоматический, локальный контекст.
да, С++ позволяет записать лямбду в function<> и и даже сделать при этом замыкание. но он так же позволяет произвольно приводить типы и записывать что угодно по любому адресу. ножик острый, но Вы же на это не жалуетесь.
а вообще С++ ужасен)))
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.