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

Поиск:

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


pattern`щик
****


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

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



всем снова доброго дня.
недавно, в GCC были реализованы User-defined Literals, и я за одно решил собрать mingw на основе trunk версии исходников. для "просветиться", так сказать.

в стандарте и гугле выловил несколько примеров, и закодил такое:
Код


#include <iostream>

long double operator"" _degrees(long double d) { return d * 0.0175; }
const char* operator"" _func1(const char* name, size_t) { return name; }

int main() {
   std::cout << 180_degrees << std::endl;
   std::cout << "function"_func1 << std::endl;
}

все работает. вывод:
Цитата

-3.65375e+046
function

далее, увидел в стандарте такую форму записи:
Цитата

2 If L is a user-defined-integer-literal, let n be the literal without its ud-suffix. 
   If S contains a literal operator with parameter type unsigned long long, the 
   literal L is treated as a call of the form
      operator "" X(nULL)
   Otherwise, S shall contain a raw literal operator or a literal operator 
   template (13.5.8 over.literal), but not both. If S contains a raw literal 
   operator the literal L is treated as a call of the form
      operator "" X("n")
   Otherwise (S contains a literal operator template), L is treated as a call of the form
      operator "" X<'c1', 'c2', … , 'ck'>()
   where n is the source character sequence c1c2…ck. 
  [Note: The sequence c1c2…ck can only contain characters from the basic source character set. —end note]


и попробовал записать это так:
Код

template<char... chars>
int operator"" _var_string() { return sizeof...(chars); }

но получаю такую ошибку:
Цитата

error: unable to find valid user-defined string literal operator 'operator"" _var_string'.
Possible missing length argument in string literal operator.

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

полный код:
Код


#include <iostream>

long double operator"" _degrees(long double d) { return d * 0.0175; }
const char* operator"" _func1(const char* name, size_t) { return name; }
template<char... chars>
constexpr int operator"" _var_string() { return sizeof...(chars); }

int main() {
   std::cout << 180_degrees << std::endl;
   std::cout << "function"_func1 << std::endl;
   std::cout << "some string"_var_string << std::endl;
}


это первый вопрос.


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

спасибо.

Добавлено через 4 минуты и 34 секунды
Цитата(boostcoder @  9.11.2011,  13:32 Найти цитируемый пост)
template<char... chars>
int operator"" _var_string() { return sizeof...(chars); }

кстати на вики приводится такой же пример: http://en.wikipedia.org/wiki/C%2B%2B11#User-defined_literals

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


Эксперт
****


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

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



На сколько я понял написанное в описании этой фичи, тебе необходимо добавить параметр в литерал _var_string...

кстати, а что значит "char..."?
PM   Вверх
boostcoder
Дата 9.11.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(bsa @  9.11.2011,  13:42 Найти цитируемый пост)
тебе необходимо добавить параметр в литерал _var_string

чего я только туда не добавлял smile 

Цитата(bsa @  9.11.2011,  13:42 Найти цитируемый пост)
кстати, а что значит "char..."?

variadic template состоящий из переменного кол-ва чаров.

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


Бревно
**


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

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



Это ужас. Такими стараниями еще чуть-чуть и они доведут С++ по уровню write-only до перла. Вот эти литералы, &&-ссылки (в следующем стандарте уже предусмотрели что-нибудь для &&&?), нагромождения в темплейтах, синтаксически ужасные лямбды... Все это очень печально.

В голове вертится мысль, что эти литералы можно как-то использовать в мета-программировании, но пока без конкретики.


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


pattern`щик
****


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

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



 smile 
Цитата(newbee @  9.11.2011,  13:49 Найти цитируемый пост)
синтаксически ужасные лямбды

лямбды очень даже юзабильные.

Цитата(newbee @  9.11.2011,  13:49 Найти цитируемый пост)
можно как-то использовать в мета-программировании

это одно из применений. вот только хочется понять всю идею.
PM WWW   Вверх
newbee
Дата 9.11.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(boostcoder @  9.11.2011,  14:52 Найти цитируемый пост)
лямбды очень даже юзабильные.
Они полностью выбиваются из синтаксиса С++ (того, уже старого С++). ну вот пример из википедии:
Код
[](int x, int y) -> int { int z = x + y; return z; }
Что за помесь бульдога с носорогом с++ и хаскеля? Это конечно лучше тех позорных недолямбд из буста, но все равно фу!

Код
auto outlist = filter(inlist, [](int x){return x>5;}); // это никуда не годится
auto outlist = filter(inlist, (x){return x>5}); // например так было бы куда удачней с т.з. сохранения синтаксиса языка
Опять же, дополнительные модификаторы типов параметров в []-начале лямбды, что за идиотизм? Нужно было приделывать внутри ()-параметров к каждому аргументу.


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


pattern`щик
****


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

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



Цитата(newbee @  9.11.2011,  14:09 Найти цитируемый пост)
Опять же, дополнительные модификаторы типов параметров в []-начале лямбды, что за идиотизм? Нужно было приделывать внутри ()-параметров к каждому аргументу.

прошу прощения за прямоту, но ты совершенно не в теме.
внутри квадратных скобок размещается список захвата переменных в текущем скопе. и к аргументам он не имеет никакого отношения.

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


Бревно
**


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

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



Цитата(boostcoder @  9.11.2011,  15:28 Найти цитируемый пост)
внутри квадратных скобок размещается список захвата переменных в текущем скопе, и выше. и к аргументам он не имеет никакого отношения. 
Кхм, так это "настройка" замыкания. Точно не в теме smile Но это же не нужно. Все "внешние" переменные, использованные в лямбде, должны автоматически замыкаться с доступом на чтение/запись. Совершенно лишние усложнения.


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


Эксперт
****


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

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



Цитата(newbee @  9.11.2011,  15:42 Найти цитируемый пост)
Совершенно лишние усложнения. 
согласен
PM   Вверх
mes
Дата 9.11.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(newbee @  9.11.2011,  13:42 Найти цитируемый пост)
 Все "внешние" переменные, 

они могут быть захвачены, как по ссылке,так и по значению.. без подсказки компилятор не знает как в конткретном случае поступать..


Цитата(newbee @  9.11.2011,  13:09 Найти цитируемый пост)
но все равно фу!

синтаксис да фу, но их теперешнее наличие  smile 

и да это оффтопик.. 


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


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


Бревно
**


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

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



Цитата(mes @  9.11.2011,  18:13 Найти цитируемый пост)
они могут быть захвачены, как по ссылке,так и по значению.. без подсказки компилятор не знает как в конткретном случае поступать..
Достаточно всегда захватывать по ссылке. Есть ли смысл захватывать по значению? То есть каждый раз копировать исходный объект, правильно? Просто я много пишу кода с замыканиями, и ни разу не приходило в голову, что может понадобиться семантика с копированием замкнутого объекта.


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


pattern`щик
****


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

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



Цитата(newbee @  9.11.2011,  17:56 Найти цитируемый пост)
Есть ли смысл захватывать по значению?

банально - существование функционального объекта инкрементирует счетчик ссылок.

Добавлено через 37 секунд
похоже, что делать с сабжем, никто не знает...
PM WWW   Вверх
newbee
Дата 9.11.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(boostcoder @  9.11.2011,  19:06 Найти цитируемый пост)
банально - существование функционального объекта инкрементирует счетчик ссылок.
А если теперь по-русски, пожалуйста? Имеется в виду, что внутри лямбды инкрементируется замкнутая переменная? Но это же замыкание по ссылке, а не по значению... Я руководствуюсь тем, как это называется в случае аргументов функций: по ссылке - пришел int &x, по значению - пришел int x. Или тут все по-другому называется, и я опять не в теме?:(


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


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


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

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



newbee, функтор может быть вызван не в контексте его создания, а гораздо позже.. 



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


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


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

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



Цитата(boostcoder @  9.11.2011,  17:06 Найти цитируемый пост)
похоже, что делать с сабжем, никто не знает...

насколько я понимаю, возвращаемый тип может быть любым ?


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


Бревно
**


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

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



Цитата(mes @  9.11.2011,  19:19 Найти цитируемый пост)
newbee, функтор может быть вызван не в контексте его создания, а гораздо позже.. 
Это конечно так и так и должно быть. Но я сейчас начала тестировать.... Если я ничего не напутала, это какие-то неуклюжие, неполноценные и вообще бесполезные замыкания, работающие на стеке. Самый примитивный пример: функция foo, в ней объявлена какая-нибудь переменная xx (пусть она даже придет в качестве аргумента foo - не суть), она возвращает две лямбды: одна увеличивает xx, вторая возвращает текущее значение xx. Вот пример на лиспе:

Код

(defun foo (xx)
 (list                           ; возвращаем список из двух лямбд
  (lambda () xx)                 ; первая возвращает xx
  (lambda (a) (incf xx a))))     ; вторая увеличивает xx на переданный параметр

(setq l (foo 42))                ; вызываем фу и сохраняем результат в переменную l

(funcall (first l))              ; вызываем первую лямбду
  -> 42

(funcall (second l) -12)         ; вызываем вторую лямбду

(funcall (fist l))               ; и снова первую
  -> 30


Вот это настоящее замыкание. Теперь то, как я пыталсь воспроизвести такое поведение на С++:

Код

#include<functional>
#include<iostream>

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

two_lm foo(){
 int xx=42;
 two_lm tt;
 tt.l1=[&](int a){xx+=a;return xx;}; // если тут сделать [=], не скомпилится
 tt.l2=[=](int a){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;
 return 0;}


Умоляю, скажите, что я что-то сделала не так, и замыкания в С++ настоящие!


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


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


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

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



с [&] обе лямбды будут ссылаться не на свои данные,
в первом случае с [=] ругается из за того что пытаетесь изменить рвалуе

Добавлено через 1 минуту и 47 секунд
Цитата(newbee @  9.11.2011,  18:02 Найти цитируемый пост)
вторая увеличивает xx на переданный параметр

за время жизни захваченной по ссылке отвечает программист

Добавлено через 5 минут и 53 секунды
Цитата(newbee @  9.11.2011,  18:02 Найти цитируемый пост)
Умоляю, скажите, что я что-то сделала не так, и замыкания в С++ настоящие! 

замкнули стековую переменную.. С++ императивный язык..



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


Бревно
**


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

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



Цитата(mes @  9.11.2011,  20:10 Найти цитируемый пост)
с [&] обе лямбды будут ссылаться не на свои данные,
в первом случае с [=] ругается из за того что пытаетесь изменить рвалуе
Ну это понятно.

Цитата(mes @  9.11.2011,  20:10 Найти цитируемый пост)
за время жизни захваченной по ссылке отвечает программист 
То есть замыканий в С++ не появилось. Я все больше разочаровываюсь в новом С++.

Цитата(mes @  9.11.2011,  20:10 Найти цитируемый пост)
замкнули стековую переменную.. С++ императивный язык..
И что? Это же не надстройка над ассемблером, компилятор должен выделить эту переменную в некоторый контекст и, когда все пользователи контекста исчезнут, освободить его. Программист может сам сэмулировать такое поведение, сохранив "замкнутые" переменные в каком-нибудь объекте и таская ссылку/указатель на него между функциями, но это все отстой.


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


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


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

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



newbee
1. С++ не делает того что непросит пользователь, особенно если касается данных.. 
2. для таких случаев есть shared_ptr..

Добавлено через 1 минуту и 11 секунд
Цитата(newbee @  9.11.2011,  18:26 Найти цитируемый пост)
, но это все отстой. 

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



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


pattern`щик
****


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

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



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

так и будет, когда реализуют GC. это в текущем стандарте, так что 8 лет ждать не придется smile 
PM WWW   Вверх
mes
Дата 9.11.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  9.11.2011,  19:39 Найти цитируемый пост)
так и будет, когда реализуют GC

имхо, GC не поможет захватить стековую переменную..


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


pattern`щик
****


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

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



Цитата(mes @  9.11.2011,  21:00 Найти цитируемый пост)
GC не поможет захватить стековую переменную

доку целиком не читал, но полагаю, само понимание стековых переменных изменится.
PM WWW   Вверх
boostcoder
Дата 9.11.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



хотя...мне тут подсказывают, что GC может быть вовсе исключен уже после утверждения стандарта.
PM WWW   Вверх
newbee
Дата 9.11.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(boostcoder @  9.11.2011,  21:39 Найти цитируемый пост)
так и будет, когда реализуют GC. это в текущем стандарте, так что 8 лет ждать не придется
Не нужен для этого сложный GC. Тут тривиальный подсчет ссылок, который можно воткнуть прямо в компилятор. С каждой лямбдой, созданной в данном контексте ассоциируется счетчик контекста, когда все лямбды будут уничтожены, контекст может смело очищаться. Между контекстами даже циклических зависимостей не бывает.

Цитата(mes @  9.11.2011,  22:00 Найти цитируемый пост)
имхо, GC не поможет захватить стековую переменную.. 
Что ты все за стек переживаешь, компилятор просто не кладет замкнутую переменную на стек, кроме случаев, когда замыкание гарантированно не вылезет за пределы функции.

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


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


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


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

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



Цитата(newbee @  9.11.2011,  20:34 Найти цитируемый пост)
компилятор просто не кладет замкнутую переменную на стек

смотря какие компиляторы.. В примере который написан выше захват идет именно стековой переменной.. 
если добавят в с++ gc, то gc-указатели будут иметь свой синтаксис.. 

Цитата(newbee @  9.11.2011,  20:34 Найти цитируемый пост)
ут тривиальный подсчет ссылок

Цитата(mes @  9.11.2011,  18:39 Найти цитируемый пост)
shared_ptr..


Цитата(newbee @  9.11.2011,  20:34 Найти цитируемый пост)
. Не думаю, что программисты станут массово изучать язык

я рассказывал с точки зрения облегчения труда программиста, который уже знает С++




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


Бревно
**


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

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



Цитата(mes @  9.11.2011,  22:41 Найти цитируемый пост)
смотря какие компиляторы.. В примере который написан выше захват идет именно стековой переменной.. 
Разве в стандарте С++ говорится, что переменная, объявленная в функции, должна лежать на стеке? Да даже если и так, могли изменить этот пунктик, все равно новый стандарт выпускали.  Программисту ведь вообще до балды, где располагается переменная, ему достаточно знать, что после выхода из функции она уничтожится[, если только не попала в замыкание].

Цитата(mes @  9.11.2011,  22:41 Найти цитируемый пост)
shared_ptr..
А чего мелочиться, можно даже ООП на си построить (GObject) и вручную с ним ковыряться. Чем больше компилятор умеет делать сам, тем лучше, тем быстрее работает программа, тем меньше в ней ошибок и тем понятнее ее исходный код. Смотри, например на с++ средствами ООП можно кривенько и неудобненько эмулировать замыкания. И наоборот, в любом языке, умеющим замыкания, можно эмулировать ООП, даже примитивов вроде "структура" не нужно. Но это же все костыли и подпорки, язык сам должен уметь такие вещи.


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


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


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

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



Цитата(newbee @  9.11.2011,  20:56 Найти цитируемый пост)
что после выхода из функции она уничтожится

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

Цитата(newbee @  9.11.2011,  20:56 Найти цитируемый пост)
А чего мелочиться, можно даже ООП на си построить

Цитата(newbee @  9.11.2011,  20:56 Найти цитируемый пост)
 язык сам должен уметь такие вещи. 

кто то спорит с этим ? должен, но у с++ другая идеология и пока подобное не возможно.. 
я объясняю лишь почему это на текущий момент нельзя... 


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


Бревно
**


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

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



Цитата(mes @  9.11.2011,  23:04 Найти цитируемый пост)
вот именно..  это для тривиальных не важно где и когда уничтожатся.. но есть множество объектов которых просто нельзя замыкать без разрешения пользователя..
Что например нельзя замыкать? Без какого разрешения? Программист сам создает замыкание с определенными переменными, засунув их в лямбду. Вот тебе и разрешение.

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


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


pattern`щик
****


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

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



сейчас напишу девелоперам GCC с вопросом о ситуации приведенной newbee. ведь по логике, получается правильно, если переменная попадает в список захвата, то компилятор изначально должен ее размещать не на стеке(в прямом понимании).

Добавлено через 8 минут и 17 секунд
Цитата(boostcoder @  9.11.2011,  22:12 Найти цитируемый пост)
сейчас напишу девелоперам GCC

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


Бревно
**


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

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



Цитата(boostcoder @  9.11.2011,  23:12 Найти цитируемый пост)
хм.. а есть ли смысл? 
Неа. Пиши сразу Страуструпу smile



--------------------
You're face to face
With man who sold the world
PM   Вверх
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.1969 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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