D vs C++
    , почти сурковская пропаганда: не пора ли C++ потихоньку готовиться к пенсии?
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    Правила раздела:
  | Страницы: (56) « Первая ... 41 42 [43] 44 45 ... 55 56 ( Перейти к последнему сообщению ) | 
    D vs C++
    , почти сурковская пропаганда: не пора ли C++ потихоньку готовиться к пенсии?
  | 
         
         
         
          
           Сообщ.
           #631
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата applegame @  Нет. Как уже сказал D_KEY, = скопирует указатель и будет прав. Если мне нужно скопировать его содержимое, то я и напишу соответственно, сразу же указав параметром не T, а T*, и копировать буду источником разыменованный аргумент, а не его самого.Дак в плюсах тоже самое: для указателей нужно вызывать clone, а для неуказателей =. Единая семантика – либо значений, либо ссылок – тем и хороша, что я всегда знаю, с чем работаю, и если мне требуется разное поведение для значений/ссылок/указателей, я это легко сделаю либо перегрузкой, либо специализацией. В Плюсах принята семантика значений, но при этом я любой тип легко могу объявить ссылочным простым &. Не всегда это может быть удобно, но альтернатива хуже. Если бы была принята семантика ссылок, то и тут проблемы бы не было, наверняка был бы единый способ явно разыменовать ссылку, чтобы достучаться до хранилища объекта. В случае смешанной семантики у меня нет иного выбора, кроме как ветвиться метакодом, т.к. под T может скрываться и значение, и ссылка, и что конкретно придёт в мой обобщённый код в некой конкретной точке его инстанцирования, я заранее знать никак не могу.  | 
    
| 
         
         
         
          
           Сообщ.
           #632
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Ну тогда объясни, что хотел оппонент и зачем он упомянул clone(). 
        
      Тоже самое в D. Для более легкого понимания, представь, что класс в D - это просто особый тип указателя, например shared_ptr. Добавлено Цитата Qraizer @  А clone() тогда зачем упомянул? То ли хотел сбить меня с толку, то ли решил мгновенно на другие рельсы перепрыгнуть.Нет. Как уже сказал D_KEY, = скопирует указатель и будет прав. Цитата Qraizer @  Я тебя не понимаю. Зачем ветвиться? Просто делай присваивание, скопируется обычный указатель или указатель на класс или значение. Никаких ветвлений. 	  В случае смешанной семантики у меня нет иного выбора, кроме как ветвиться метакодом,   | 
    
| 
         
         
         
          
           Сообщ.
           #633
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата applegame @  Тоже самое в D. Для более легкого понимания, представь, что класс в D - это просто особый тип указателя, например shared_ptr. Представить я могу все, что угодно. Но в системе типов D для классов сделано исключение     | 
    
| 
         
         
         
          
           Сообщ.
           #634
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата D_KEY @  Это не исключение, это ещё один самостоятельный тип. Ты же не называешь указатели исключением.  Но в системе типов D для классов сделано исключение  ![]() Единственная претензия, пожалуй, это то, что выглядит оно как передача по значению, а передается указатель.  | 
    
| 
         
         
         
          
           Сообщ.
           #635
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата applegame @  скопируется обычный указатель или указатель на класс или значение. Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*.  | 
    
| 
         
         
         
          
           Сообщ.
           #636
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же. 
        
      applegame, к примеру, иногда в функции, чтобы получить результат, необходимо "поиграться" с состоянием объекта. Например, объект у тебя притворяется числом (представляет дробь или является числом высокой точности, или ещё что-нибудь в этом роде). К при меру число это представляет собой угол (в градусах), и тебе необходимо загнать его в интервал ±180°. Простейший способ — прибавлять/вычитать 360, но чтобы не испортить состояние исходного объекта, ссылку на который ты передал, тебе лучше бы работать с копией. Если ты передаёшь целое или вещественное (встроенный тип), то простое = создаёт тебе копию, с которой ты можешь спокойно манипулировать. Если ты передаёшь числовой объект, то = просто создаёт ещё одну ссылку и все манипуляции отражаются на исходном объекте, портя его. Можно конечно вместо конструкции a += 360 использовать a = a + 360, каждый раз создавая новый объект, но это резко снижает эффективность, поскольку начинаются игры с распределением/освобождением памяти. Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько), в D, я так понял, нет. В том же Python'е есть функция copy, которая возвращает копию объекта, независимо от того, встроенный это тип или объект, созданный пользователем. Там даже есть функция deepcopy, создающая независимые копии ещё и вложенных объектов. Правда она медленная. В принципе, достаточно написать одну такую функцию и потом ей пользоваться, где понадобится копия.  | 
    
| 
         
         
         
          
           Сообщ.
           #637
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата applegame @  Цитата D_KEY @  Это не исключение, это ещё один самостоятельный тип. Ты же не называешь указатели исключением.  Но в системе типов D для классов сделано исключение  ![]() Так они и не являются исключением. А класс в D является.  | 
    
| 
         
         
         
          
           Сообщ.
           #638
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата D_KEY @  И чем же он будет отличаться? Будет создана копия значения этого типа, а именно типа класс такой-то. В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. Цитата D_KEY @  В D будет. Получится нечто похожее на плюсовой T**.  В частности, не будет иметь смысл T*  | 
    
| 
         
         
         
          
           Сообщ.
           #639
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата amk @  Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же. applegame, к примеру, иногда в функции, чтобы получить результат, необходимо "поиграться" с состоянием объекта. Например, объект у тебя притворяется числом (представляет дробь или является числом высокой точности, или ещё что-нибудь в этом роде). К при меру число это представляет собой угол (в градусах), и тебе необходимо загнать его в интервал ±180°. Простейший способ — прибавлять/вычитать 360, но чтобы не испортить состояние исходного объекта, ссылку на который ты передал, тебе лучше бы работать с копией. Если ты передаёшь целое или вещественное (встроенный тип), то простое = создаёт тебе копию, с которой ты можешь спокойно манипулировать. Если ты передаёшь числовой объект, то = просто создаёт ещё одну ссылку и все манипуляции отражаются на исходном объекте, портя его. Можно конечно вместо конструкции a += 360 использовать a = a + 360, каждый раз создавая новый объект, но это резко снижает эффективность, поскольку начинаются игры с распределением/освобождением памяти. Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько), в D, я так понял, нет. В том же Python'е есть функция copy, которая возвращает копию объекта, независимо от того, встроенный это тип или объект, созданный пользователем. Там даже есть функция deepcopy, создающая независимые копии ещё и вложенных объектов. Правда она медленная. В принципе, достаточно написать одну такую функцию и потом ей пользоваться, где понадобится копия. Не то, чтобы я тут был за кого-то. Но в качестве примера, где мешает ссылочная семантика приведён пример говнокода   В данном сценарии я скорее за семантику, которая не одобряет такое поведение     | 
    
| 
         
         
         
          
           Сообщ.
           #640
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата amk @  Ты издеваешься? Я тебе не Исмаил Прокопенко, я отлично разбираюсь и в указателях и ссылках и значениях. В D также существует передача по значению и по ссылке, правда самостоятельного типа "ссылка" не существует. Ты мне тут лекции по плюсам для детского сада не читай. У нас тут скорее философский диспут, а не спор о тонкостях работы типов. 	 Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же.  | 
    
| 
         
         
         
          
           Сообщ.
           #641
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата D_KEY @  Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*.  На самом деле в С++, с нововведениями их последних стандартов, система типов превратилась тоже в неочевидную. И теперь приходится учитывать много ньюансов. Я про все эти rvalue/lvalue ссылки.  | 
    
| 
         
         
         
          
           Сообщ.
           #642
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Цитата D_KEY @  Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*.  На самом деле в С++, с нововведениями их последних стандартов, система типов превратилась тоже в неочевидную. И теперь приходится учитывать много ньюансов. Я про все эти rvalue/lvalue ссылки. Согласен. Ссылки изначально были не логичны. Сейчас все стало совсем плохо.  | 
    
| 
         
         
         
          
           Сообщ.
           #643
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата D_KEY @  Согласен. Ссылки изначально были не логичны. Сейчас все стало совсем плохо.  По крайней мере там все было очевидно и предсказуемо, а теперь совсем беда. Особенно с универсальными ссылками.  | 
    
| 
         
         
         
          
           Сообщ.
           #644
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Не, ну оно понятно и юзабельно. Но через гланды.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #645
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Если вы пишете обобщенную функцию, принимающий любой тип, включая указатели, то для создания копии экземпляра вам придется, как выразился Qraizer, ветвить код, например писать отдельные оверлоады или шаблоны для значений и для указателей. То же самое в D, вам придется ветвиться, но на один тип больше - классы. Важно заметить, что классы в D не похожи на ссылки в плюсах, они похожи именно на указатели.  
        
      Добавлено Цитата D_KEY @  не вижу оснований называть это исключением. Например shared_ptr иммитирует ссылочную семантику, но никто не называет его исключением. Так они и не являются исключением. А класс в D является. Добавлено Цитата negram @  Интересно. Назови-ка мне независимый способ получения копии экземпляра объекта в плюсах. Скажем, я передал указатель и нужно создать копию объекта, на который этот указатель указывает. 	 Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько),   |