Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.221.52] |
|
Страницы: (56) « Первая ... 40 41 [42] 43 44 ... 55 56 ( Перейти к последнему сообщению ) |
Сообщ.
#616
,
|
|
|
Цитата OpenGL @ У них же классы представлены ссылочной семантикой. Бред, конечно, но они привыкли. Пусть порадуются, чё. А если у тебя в захвате переменная, содержащая данные в куче - она не скопируется что ли? |
Сообщ.
#617
,
|
|
|
Ну разве что синтетику какую-нибудь попробовать.
Цитата OpenGL @ Скопируется при создании лямбды, а при копировании этой лямбды (например при передаче в функцию или сохранении в переменной) замыкания копироваться не будут. А разве должны?Не понял. А если у тебя в захвате переменная, содержащая данные в куче - она не скопируется что ли? Цитата JoeUser @ Вероятнее всего мейнтейнер GDC. Ты можешь попробовать спросить у него самого по поводу этой проблемы, а то и помочь с ней. Кстати, можно под линем компилять код для вянды через wine, говорят все работаэ. Я вот задумался Рано или поздно "новый" GCC (с поддержкой DLang) перекочует в mingw32. Сейчас в библиотеках runtime и phobos есть ошибки, приводящие к невозможности кросс-компиляции. На сколько я правильно разобрался - ошибки из-за неверно расставленных условий компиляции (нет понятия "целевой платформы", есть понятие используемой платформы, т.е. где компилируем/собираем - та и цель). Вопрос ... ну и кто будет (и вообще будет ли) разбираться с этой проблемой? Цитата Qraizer @ Не забывай, что "у них" есть еще структуры, которые имеют семантику по значению.У них же классы представлены ссылочной семантикой. Бред, конечно, но они привыкли. А в передаче классов по ссылке есть некий смысл. Не могу точно утверждать, но лично у меня создалось впечатление, что большая часть объектов в плюсах обычно передается при помощи указателей/ссылок или же сами являются обертками вокруг указателей. Но это немного не имеет отношения к обсуждаемой теме, так как лямбды в D это не класс, это встроенный в язык тип. Встроенность еще дает возможность компилятору проводить некоторые оптимизации, например в случае если время жизни переменных замыкания гарантированно больше, чем время жизни самой лямбды, то память не аллоцируется вообще, а просто передается указатель на стековый фрейм содержащий переменные замыкания. |
Сообщ.
#618
,
|
|
|
Цитата applegame @ Та не, речь не об этом. Речь о том, что переменная-объект всегда является ссылкой, так что любые присваивания просто копирую ссылку. При необходимости получить копию объекта это нужно заказать явно.А в передаче классов по ссылке есть некий смысл. Я не имею ничего против ссылочной семантики как таковой, но я категорически не приемлю смешанную семантику, когда в языке одни типы ссылочные, другие значения. |
Сообщ.
#619
,
|
|
|
Цитата Qraizer @ Ну это тема отдельного холивора. Хотя как раз вот тут-то лично я склонен с тобой согласиться. Конечно не столь категорично, но таки мне не нравится эта особенность D. Но как показывает практика - не мешает. То есть раздражение чисто академическое. Я не имею ничего против ссылочной семантики как таковой, но я категорически не приемлю смешанную семантику, когда в языке одни типы ссылочные, другие значения. |
Сообщ.
#620
,
|
|
|
Это мешает обобщённого коду, заставляя применять метакод с ветвлениями по свойствам типа. Кроме того, винегрет в Дельфи со строками заставляет серьёзно задуматься о том, чтобы категоричность-таки была, просто во избежание прецедентов.
|
Сообщ.
#621
,
|
|
|
Цитата Qraizer @ Как именно? Я не наблюдал никаких помех. Пример если можно.Это мешает обобщённого коду, заставляя применять метакод с ветвлениями по свойствам типа. Цитата Qraizer @ Не готов говорить о Дельфи. D - не Дельфи. Кроме того, винегрет в Дельфи со строками заставляет серьёзно задуматься о том, чтобы категоричность-таки была, просто во избежание прецедентов. |
Сообщ.
#622
,
|
|
|
Та обсуждалось уже мульён раз. Типичный пример: тебе нужна локальная копия объекта, и толи = писать, то ли .clone() заранее ты знать не можешь. Для объектов классов = не сделает тебе копию, в результате модификации будут отражены на оригинале, для объектов неклассов .clone() просто провалится.
Добавлено Цитата applegame @ За D я тут и не говорю. Говорю за Дельфи. У них там хренова туча типов строк, какие-то объекты, какие-то не объекты, кто-то по сути POD, кто-то объект с состоянием, кто-то сам собой владеет и подсчитывает свои экземпляры, за кем-то надо следить самому, иначе утекут ресурсы, кому-то явно нужно командовать подсчитывать, кому-то если скомандуешь, расфигачишь пол-программы неопределённым поведением. Та ну их нахрен. Не готов говорить о Дельфи. D - не Дельфи. |
Сообщ.
#623
,
|
|
|
Цитата Qraizer @ Дак в плюсах тоже самое: для указателей нужно вызывать clone, а для неуказателей =. Можно представить, что класс D это что-то вроде shared_ptr. Та обсуждалось уже мульён раз. Типичный пример: тебе нужна локальная копия объекта, и толи = писать, то ли .clone() заранее ты знать не можешь. Для объектов классов = не сделает тебе копию, в результате модификации будут отражены на оригинале, для объектов неклассов .clone() просто провалится. |
Сообщ.
#624
,
|
|
|
Цитата applegame @ Дак в плюсах тоже самое: для указателей нужно вызывать clone, а для неуказателей =. Зачем? template<typename T> void foo(const T & x) { T a = x; } В случае указателей ты получишь копию указателя. Все одинаково, какой бы тип не был. Единственное, что не совсем логично в плюсах в плане типов - это ссылки. Добавлено Неужели в D нельзя написать аналог такого кода? |
Сообщ.
#625
,
|
|
|
Цитата D_KEY @ В твоем примере не указатель, а ссылка. Зачем? Добавлено Цитата D_KEY @ Для классов нет. Для структур можно. Неужели в D нельзя написать аналог такого кода? |
Сообщ.
#626
,
|
|
|
Цитата applegame @ Цитата D_KEY @ В твоем примере не указатель, а ссылка.Зачем? Мой пример будет работать для любого T, даже если этот T будет указателем. |
Сообщ.
#627
,
|
|
|
Код аналогичный твоему:
void foo(T)(const ref T x) { T t = x; } В случае указатели или класса будет сделана копия указателя / указателя на класс, в остальных случаях копия самого объекта. Добавлено Цитата D_KEY @ Неправильно он будет работать, читай пост Qraizerа, он хочет именно копию объекта, а не копию укпзателя на него. Мой пример будет работать для любого T, даже если этот T будет указателем. |
Сообщ.
#628
,
|
|
|
Цитата applegame @ Код аналогичный твоему: void foo(T)(const ref T x) { T t = x; } В случае указатели или класса будет сделана копия указателя / указателя на класс, в остальных случаях копия самого объекта. Вот и появляются исключения на ровном месте. Для обобщенного кода куда проще, когда поведение одинаковое(концептуально). Добавлено Цитата applegame @ Непрпвильно он будет работать, читай пост Qraizerа, он хочет именно копию объекта, а не копию укпзателя на него. Указатель - самостоятельный тип. И его значение будет скопировано. Как и для любого другого типа. |
Сообщ.
#629
,
|
|
|
Цитата D_KEY @ Какие исключения? Мой код делает ровно тоже самое, что и твой.Вот и появляются исключения на ровном месте. Для обобщенного кода куда проще, когда поведение одинаковое(концептуально). Цитата D_KEY @ И? Ты как-то влез в наш разговор не разобрпвшись о чем речь, Крайзер не хотел копию указателя, он хотел копию объекта, иначе зачем он clone() упомянул. И если ты хочешь некую обобщеную функцию придется метакодить, чтобы отличить указатель от значения. Указатель - самостоятельный тип. И его значение будет скопировано. Как и для любого другого типа. |
Сообщ.
#630
,
|
|
|
Цитата applegame @ И? Ты как-то влез в наш разговор не разобрпвшись о чем речь Думаю, что это ты неверно понял оппонента. Цитата Крайзер не хотел копию указателя, он хотел копию объекта Ты C++ забыл? Указатель является самостоятельным типом и его объект содержит адрес. Добавлено В C++ у тебя везде семантика значений. В D одни типы обладают семантикой значений, а другие - ссылочные. Добавлено Цитата applegame @ Цитата D_KEY @ Какие исключения? Мой код делает ровно тоже самое, что и твой.Вот и появляются исключения на ровном месте. Для обобщенного кода куда проще, когда поведение одинаковое(концептуально). Мой код всегда создаёт копию значения типа T. Твой - нет. |