| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > способ применения User-defined Literals? |
| Автор: bsa 9.11.2011, 13:42 |
| На сколько я понял написанное в описании этой фичи, тебе необходимо добавить параметр в литерал _var_string... кстати, а что значит "char..."? |
| Автор: boostcoder 9.11.2011, 13:44 |
чего я только туда не добавлял variadic template состоящий из переменного кол-ва чаров. |
| Автор: newbee 9.11.2011, 13:49 |
| Это ужас. Такими стараниями еще чуть-чуть и они доведут С++ по уровню write-only до перла. Вот эти литералы, &&-ссылки (в следующем стандарте уже предусмотрели что-нибудь для &&&?), нагромождения в темплейтах, синтаксически ужасные лямбды... Все это очень печально. В голове вертится мысль, что эти литералы можно как-то использовать в мета-программировании, но пока без конкретики. |
| Автор: boostcoder 9.11.2011, 13:52 |
| лямбды очень даже юзабильные. это одно из применений. вот только хочется понять всю идею. |
| Автор: newbee 9.11.2011, 14:09 | ||||
Они полностью выбиваются из синтаксиса С++ (того, уже старого С++). ну вот пример из википедии:
|
| Автор: boostcoder 9.11.2011, 14:28 | ||
прошу прощения за прямоту, но ты совершенно не в теме. внутри квадратных скобок размещается список захвата переменных в текущем скопе. и к аргументам он не имеет никакого отношения. |
| Автор: newbee 9.11.2011, 14:42 | ||
|
| Автор: bsa 9.11.2011, 14:52 |
| согласен |
| Автор: mes 9.11.2011, 17:13 |
они могут быть захвачены, как по ссылке,так и по значению.. без подсказки компилятор не знает как в конткретном случае поступать.. синтаксис да фу, но их теперешнее наличие и да это оффтопик.. |
| Автор: newbee 9.11.2011, 17:56 |
| Достаточно всегда захватывать по ссылке. Есть ли смысл захватывать по значению? То есть каждый раз копировать исходный объект, правильно? Просто я много пишу кода с замыканиями, и ни разу не приходило в голову, что может понадобиться семантика с копированием замкнутого объекта. |
| Автор: boostcoder 9.11.2011, 18:06 |
банально - существование функционального объекта инкрементирует счетчик ссылок. Добавлено через 37 секунд похоже, что делать с сабжем, никто не знает... |
| Автор: newbee 9.11.2011, 18:16 |
| А если теперь по-русски, пожалуйста? Имеется в виду, что внутри лямбды инкрементируется замкнутая переменная? Но это же замыкание по ссылке, а не по значению... Я руководствуюсь тем, как это называется в случае аргументов функций: по ссылке - пришел int &x, по значению - пришел int x. Или тут все по-другому называется, и я опять не в теме?:( |
| Автор: mes 9.11.2011, 18:19 |
| newbee, функтор может быть вызван не в контексте его создания, а гораздо позже.. |
| Автор: mes 9.11.2011, 18:53 |
насколько я понимаю, возвращаемый тип может быть любым ? |
| Автор: newbee 9.11.2011, 19:02 | ||||||
Вот это настоящее замыкание. Теперь то, как я пыталсь воспроизвести такое поведение на С++:
Умоляю, скажите, что я что-то сделала не так, и замыкания в С++ настоящие! |
| Автор: mes 9.11.2011, 19:10 | ||
| с [&] обе лямбды будут ссылаться не на свои данные, в первом случае с [=] ругается из за того что пытаетесь изменить рвалуе Добавлено через 1 минуту и 47 секунд за время жизни захваченной по ссылке отвечает программист Добавлено через 5 минут и 53 секунды
замкнули стековую переменную.. С++ императивный язык.. |
| Автор: newbee 9.11.2011, 19:26 | ||
То есть замыканий в С++ не появилось. Я все больше разочаровываюсь в новом С++. И что? Это же не надстройка над ассемблером, компилятор должен выделить эту переменную в некоторый контекст и, когда все пользователи контекста исчезнут, освободить его. Программист может сам сэмулировать такое поведение, сохранив "замкнутые" переменные в каком-нибудь объекте и таская ссылку/указатель на него между функциями, но это все отстой. |
| Автор: mes 9.11.2011, 19:39 |
| newbee, 1. С++ не делает того что непросит пользователь, особенно если касается данных.. 2. для таких случаев есть shared_ptr.. Добавлено через 1 минуту и 11 секунд а вот это в точку но в сравнение с тем что было, с++ стал просто ангелом |
| Автор: boostcoder 9.11.2011, 20:39 | ||
так и будет, когда реализуют GC. это в текущем стандарте, так что 8 лет ждать не придется |
| Автор: mes 9.11.2011, 21:00 |
имхо, GC не поможет захватить стековую переменную.. |
| Автор: boostcoder 9.11.2011, 21:09 |
доку целиком не читал, но полагаю, само понимание стековых переменных изменится. |
| Автор: boostcoder 9.11.2011, 21:29 |
| хотя...мне тут подсказывают, что GC может быть вовсе исключен уже после утверждения стандарта. |
| Автор: newbee 9.11.2011, 21:34 | ||
Что ты все за стек переживаешь, компилятор просто не кладет замкнутую переменную на стек, кроме случаев, когда замыкание гарантированно не вылезет за пределы функции. Ну лично я вижу больше синтаксического мусора, чем достоинств. Не думаю, что программисты станут массово изучать язык, с таким вектором развития путь у него только в могилу, к сожалению. |
| Автор: mes 9.11.2011, 21:41 |
смотря какие компиляторы.. В примере который написан выше захват идет именно стековой переменной.. если добавят в с++ gc, то gc-указатели будут иметь свой синтаксис.. я рассказывал с точки зрения облегчения труда программиста, который уже знает С++ |
| Автор: newbee 9.11.2011, 21:56 | ||
А чего мелочиться, можно даже ООП на си построить (GObject) и вручную с ним ковыряться. Чем больше компилятор умеет делать сам, тем лучше, тем быстрее работает программа, тем меньше в ней ошибок и тем понятнее ее исходный код. Смотри, например на с++ средствами ООП можно кривенько и неудобненько эмулировать замыкания. И наоборот, в любом языке, умеющим замыкания, можно эмулировать ООП, даже примитивов вроде "структура" не нужно. Но это же все костыли и подпорки, язык сам должен уметь такие вещи. |
| Автор: mes 9.11.2011, 22:04 |
вот именно.. это для тривиальных не важно где и когда уничтожатся.. но есть множество объектов которых просто нельзя замыкать без разрешения пользователя.. кто то спорит с этим ? должен, но у с++ другая идеология и пока подобное не возможно.. я объясняю лишь почему это на текущий момент нельзя... |
| Автор: newbee 9.11.2011, 22:11 |
| Что например нельзя замыкать? Без какого разрешения? Программист сам создает замыкание с определенными переменными, засунув их в лямбду. Вот тебе и разрешение. |
| Автор: boostcoder 9.11.2011, 22:12 |
| сейчас напишу девелоперам GCC с вопросом о ситуации приведенной newbee. ведь по логике, получается правильно, если переменная попадает в список захвата, то компилятор изначально должен ее размещать не на стеке(в прямом понимании). Добавлено через 8 минут и 17 секунд хм.. а есть ли смысл? |
| Автор: newbee 9.11.2011, 22:26 |
| Неа. Пиши сразу Страуструпу |
| Автор: mes 9.11.2011, 22:37 |
newbee, а если захваченная переменная это ссылка, то что с ней делать ? куда лепить подсчет ? |
| Автор: boostcoder 9.11.2011, 22:40 | ||||
или я чего-то не понимаю, или лямбда таки говорит компилятору не разрушать объекты на стеке?
http://liveworkspace.org/code/c3dfe28c7e252f01a7b160ded7607854 вывод:
Добавлено через 2 минуты и 41 секунду инкрементировать счетчик ссылок оригинальной переменной. или что? |
| Автор: mes 9.11.2011, 22:45 |
| Автор: boostcoder 9.11.2011, 22:46 |
а епс.. спать-спать-спать.. |
| Автор: mes 9.11.2011, 22:46 | ||
вот мне и интересно как newbee это представляет |
| Автор: newbee 9.11.2011, 23:00 |
| А что мешает разместить ссылку в создаваемом контексте? Ссылка на локальную переменную функции? Ну можно, как сейчас при возврате такой ссылки, писать ворнинг и падать в рантайме, можно и саму переменную утащить в контекст, наверное... Я не вижу принципиальных технических преград. |
| Автор: bsa 9.11.2011, 23:04 | ||
| Имхо, в принципе логично, что возникает UB при использовании лямбдами локальных переменных функции после выхода из этой функции. Но, блин, какого хрена городить огород, который может приводить к UB?!? Имхо, вектор развития С++ ведет к тому, что в какой-то момент, тим-лидеры будут радикально ограничивать список доступных группе функций языка, так как 80% программеров не будут знать более 80% свойств языка (числа взяты от балды)... А может в какой-то момент начнется массовая смена языка для новых проектов (хотя, вроде уже сейчас что-то в этом духе идет). Добавлено через 7 минут и 12 секунд
Имхо, это все выходит за рамки допустимого для С++. Слишком много сложных действий (причем не очевидных), которые пользователь (читай разработчик) совсем не ожидает. Например, твой подход предполагает выделение в куче контекста и создание умного указателя на него. А если у меня оператор new не работает или им пользоваться нельзя (программа для микроконтроллера, например)? Программист совсем не в курсе, что создание лямбда-функции вызовет такие "подводные" действия. Конечно, это можно прописать в учебниках и стандарте БОЛЬШИМИ КРАСНЫМИ буквами, но, есть подозрение, что книжки читают только тогда, когда все остальные методы оказались бессильны. С другой стороны, текущее поведение тоже не является чем-то правильным. Зато не нарушает идеологию - если не заказывал функциональность, то и не получишь. |
| Автор: mes 9.11.2011, 23:20 |
ссылка может быть на что угодно, и переедана откуда угодно Добавлено через 1 минуту и 4 секунды вы предлагаете усложнить еще, не получая никакой выгоды взамен.. |
| Автор: newbee 9.11.2011, 23:25 | ||
Добавлено через 4 минуты и 16 секунд Ну и? Пихаем ссылку в контест, где проблема? Я предлагаю сделать семантику замыкания такой, какая она есть в большинстве языков. Выгоды с этого вагон, это настоящее расширение парадигм С++. |
| Автор: mes 9.11.2011, 23:32 | ||
так я не против, только надо тогда и все остальное делать как в других языках..правда это уже будет совсем не С++ Добавлено через 2 минуты и 43 секунды проблема в том, что объект , с которого сняли ссылку может быть спокойно удален когда-то после выхода из функции, но до вызова лямбды.. |
| Автор: newbee 9.11.2011, 23:42 | ||||||
Добавлено через 3 минуты и 46 секунд
На, то же самое, но руками. Код может быть в произвольном порядке разбросан где угодно. Если программист ССЗБ и замыкает ссылки, пусть будет готов к веселой отладке. |
| Автор: mes 10.11.2011, 00:00 |
чтоб его побыстрее все бросили ? измени лозунг на "зачем этот калека среди языков" и вступай в ряды под эгидой kemmisto да все в этом языке так.. и лямбдами делу не поможешь.. |
| Автор: boostcoder 10.11.2011, 00:21 | ||
| по правде сказать, мне с++ нравится почти всем. нет, есть конечно неприятные мелочи. но они настолько незначительны, что на них не стОит обращать внимания. и такое мнение у меня не из-за того, что я пишу только на с/с++. я пишу и на пайтоне. и если нет категорических требований о том, что задача должна быть реализована исключительно средствами пайтона, то я всю логику пишу на с/с++ и выношу ее в .dll/.so при помощи http://www.boost.org/doc/libs/1_47_0/libs/python/doc/index.html, из из пайтона работаю с ней. нет, конечно, бывают дико скучные задачи, которые хочется за###кодить как можно быстрей. ГУЙ на пример. в таких случаях лучше это делать на более подходящем для этого ЯП. Up. кстати пайтоновские лямбды тоже ругают за ограничение в одну строку кода. Добавлено @ 00:23 тема превратилась в сплошной оффтопик. по сабжу, будут идеи?
|
| Автор: baldina 10.11.2011, 01:49 | ||
в PL-образный монстр он врядли превратится. хотя тенденция - да, нехорошая
newbee, в С++ сборки мусора нет, поэтому использовать (замкнутую) переменную вне ее контекста нельзя: нет простых методов для реализации такого функционала. насколько мне известно, комитет по стандартизации подходит к новшествам с позиции "нельзя ли это сделать имеющимися средствами", синтаксический сахар это не путь С++. путь С++ - создавать синтаксический сахар имеющимися средствами в рамках существующего синтаксиса, т.е. перегрузкой операций и метапрограммированием. что касается замыканий, они реализуются функциональными объектами, основной недостаток которых - необходимость много писать (причем задолго до места использования) что касается лямбда-выражений (заметьте, они не называются лямбда-функциями), они функциональными объектами не являются и заменяют последние в подходящем контексте (типа for_each), обеспечивая более короткую и понятную запись. они, понятно, имеют свои недостатки. на специализированном функциональном языке конечно все это гораздо стройней и изящнее, но за изящество приходится платить. Добавлено через 6 минут и 31 секунду кстати, пример Ваш с struct two_lm нехорош. концептуально нехорош. в этом примере правильно использовать функциональный объект, а идеологическая ниша лямбды - автоматический, локальный контекст. да, С++ позволяет записать лямбду в function<> и и даже сделать при этом замыкание. но он так же позволяет произвольно приводить типы и записывать что угодно по любому адресу. ножик острый, но Вы же на это не жалуетесь. а вообще С++ ужасен))) |