На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (11) « Первая ... 7 8 [9] 10 11  все  ( Перейти к последнему сообщению )  
> Баллада о ссылках в С++
    Цитата D_KEY @
    Цитата Flex Ferrum @
    Я уже говорил: пример показывает, что ссылка - это не часть типа "вообще", а часть типа конкретного параметра, часть объявления параметра.

    Достигается это за счёт кучи правил и исключений из них. T& является типом в C++, но с кучей всяких исключений и дополнительных правил. Что в итоге приводит к тому, что он часто ведёт себя не как тип :D И непонятно зачем это все сделано.
    Вот я и думаю, а что бы было, если бы в язык вместо непонятного типа ввели доп. возможность указывать способ передачи/возврата в/из функции(да и фиг с ним, пусть и локальные синонимы разрешили делать), без изменения системы типов. Правила довольно простые. Система типов не "обогащается" такими странными "полутипами". Пользователи языка не мучаются, даже если начинающие. Вопросы о связи указателей и ссылок вряд ли бы возникали так часто, как сейчас. Разработчикам компиляторов так же было бы намного легче.

    Добавлено
    Но у меня смутное чувство, что я что-то упускаю. И возможно это не ошибка дизайна языка, а какой-то гениальный ход, который до меня не доходит.

    Я думаю, что если ты попробуешь описать поведение этой замены ссылкам - ты получишь ровно те же яйца, только с видом в профиль. Для верности можешь заглянуть в спецификацию ссылок в стандарте и выкинуть то, что считаешь "лишним" для нового, правильного ref.

    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
      Этого будет мало :) Там половину стандарта нужно будет поправить, убрав особое поведение для ссылок.

      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
        Цитата D_KEY @
        Этого будет мало :) Там половину стандарта нужно будет поправить, убрав особое поведение для ссылок.
        А что особенного в поведении ссылок, кроме продления жизни временным объектам?
        Сдается мне, что в плюсах и так не существует ссылочного типа. :lol:
        ExpandedWrap disabled
          #include <iostream>
          #include <typeinfo>
           
          using namespace std;
          int main() {
              const int& a1 = 10;
              const int a2 = 10;
              cout << (typeid(a1) == typeid(a2));
              return 0;
          }

        Типы идентификаторов a1 и a2 одинаковы. Расходимся.
        Кстати, зачем запретили для ссылок sizeof и получение указателя? Было бы логично выполнять эти операции для объекта, на который указывает ссылка?
        А то сейчас ссылка в плюсах похожа на симлинк, а в идеале должна быть похожа на хардлинк.

        Добавлено
        Хотя нет. Скорее симлинк - это указатель, а хардлинк - ссылка.

        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
        Сообщение отредактировано: applegame -
          Цитата applegame @
          Типы идентификаторов a1 и a2 одинаковы.

          Так я про то и говорю всю тему :)
          Цитата
          Расходимся.

          А теперь поработай над самим типом в статике :) Поиграй с type_traits. Или подумай над специализацией шаблона.

          Цитата
          Кстати, зачем запретили для ссылок sizeof и получение указателя? Было бы логично выполнять эти операции для объекта, на который указывает ссылка?

          Так и есть :)

          Добавлено
          В смысле оно и работает так, как ты хочешь.
          Т.е. в язык зачем-то добавили тип, а затем прописали для него кучу правил, которая фактически приводит к тому, что он ведёт себя не как тип в очень многих случаях.

          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
          Сообщение отредактировано: D_KEY -
            Цитата D_KEY @
            Т.е. в язык зачем-то добавили тип

            D_KEY, сколько раз мне ещё нужно написать, что ссылка не является полноценным типом, чтобы ты, наконец, смог это прочитать это так, как написано? :)

            Это сообщение было перенесено сюда или объединено из темы "D vs C++"
            Сообщение отредактировано: Flex Ferrum -
              Цитата Flex Ferrum @
              Цитата D_KEY @
              Т.е. в язык зачем-то добавили тип

              D_KEY, сколько раз мне ещё нужно написать, что ссылка не является полноценным типом, чтобы ты, наконец, смог это прочитать это так, как написано? :)

              Я тебе сказал, что нужно делать :) Приведи пруфы.

              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                Цитата applegame @
                В данном случае не можешь, потому что контекст разный и споры разные.

                Ну а я считаю иначе. :)

                Цитата applegame @
                Не выкручивайся. Ты же сказал, что продемонстрировал то о чем говорит Qraizer, а оказалось наоборот.

                Я продемонстрировал, как компилятор может оптимизировать ссылки и не оптимизировать указатели в схожих ситуациях. Я не знаю, что ты там увидел, но показывал я именно это. И ассемблерный код это подтверждает.

                Цитата applegame @
                Ага, и ты именно так и сделал.

                Да нет. Я явно сказал компилятору, что можно, а что нельзя, причём корректными средствами. А не с помощью злобных кастов от одного к другому. Понятно, что можно (при желании) сделать ссылку на null, и две разные ссылки на одну область памяти с разными типами. Но это всё как раз из серии хаков и говнокода.

                Цитата applegame @

                Батенька, тут показано именно то, о чём я говорил. :) Ссылка на временный объект (внезапно) начинает "держать" этот объект. :) Компилятор так решил. :) Вот тут, внезапно, ссылка превращается... Превращается ссылка... Во временный объект:
                ExpandedWrap disabled
                  #include <cstdio>
                   
                  struct Val
                  {
                      int val;
                  };
                   
                  Val GetVal()
                  {
                      return Val{20};
                  }
                   
                  void Refs1()
                  {
                      volatile int a = 10;
                      const Val& b = GetVal();
                      const volatile int* volatile c = &b.val;
                      
                      std::printf("%d", a);
                      std::printf("%d", b.val);
                      std::printf("%d", *c);
                      std::printf("%p", c);
                  }

                С чего бы это? Ведь ссылка - это не более, чем сахарный константный указатель? :)

                Цитата applegame @
                Или он и так не считает? если я обявлю две переменные int& и int, будет ли компилятор считать, что их типы разные?

                Вроде ты сам на этот вопрос ответил. :)

                Цитата applegame @
                Что правда? Ну давай расскажи, как можно схлопотать проблемы с pointer aliasing не говнокодя и как ссыоки помогут бороться с этими проблемами.

                Бинарную десериализацию никогда не писал? :) Там такие штуки ловятся "на раз", если не знать, где грабли зарыты.

                Цитата applegame @
                То есть ты намеренно смухлевал? Расскажи еще, что ты знал, что ссылки на временные объекты возвращаемые из функций нельзя биндить даже к константным ссылкам.

                Ты, похоже, неправильно прочитал собою же процитированное из стандрата. Ты же сам привёл пример (https://ideone.com/CkeMhZ ), где константная ссылка прекрасно "держит" временный объект, возвращённый функцией.

                Добавлено
                Цитата D_KEY @
                Приведи пруфы.

                Пруфы чего? А могу я попросить тебя привести пруфы того, что ссылка (в c++) - это самостоятельный тип?

                Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                  Цитата D_KEY @
                  А теперь поработай над самим типом в статике :) Поиграй с type_traits. Или подумай над специализацией шаблона.
                  Ну разве что зачем-то раpрешены странные конструкции типа таких:
                  ExpandedWrap disabled
                    template<typename T>
                    struct A {
                        T a;
                    };
                     
                    template<typename T>
                    struct A<T&> {
                        T b;
                    };

                  и
                  ExpandedWrap disabled
                    typedef int& T;


                  Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                  Сообщение отредактировано: applegame -
                    Цитата applegame @
                    Ну разве что зачем-то раpрешены странные конструкции типа таких:

                    Ну, когда ты разбираешь декларацию функции, где какой-то параметр может быть помечен ссылкой, то таки да, у тебя будет срабатывать вторая специализация. Ну а затайпдефить ты можешь что угодно. Тут так же, как и с указателями - несмотря на то, что "указатель" относится к декларации (а не к типу), ты можешь затайпдефить его и использовать.

                    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                      Цитата Flex Ferrum @
                      Тут так же, как и с указателями - несмотря на то, что "указатель" относится к декларации (а не к типу), ты можешь затайпдефить его и использовать.

                      :facepalm: Это исключительно вопрос синтаксиса.
                      Указатели являются типом. И, в отличие от ссылок, типом полноценным.

                      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                        Цитата D_KEY @
                        Указатели являются типом. И, в отличие от ссылок, типом полноценным.

                        Да? А пруф можно? :) Может ещё и константность типом является? :)

                        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                        Сообщение отредактировано: Flex Ferrum -
                          Цитата Flex Ferrum @
                          Пруфы чего?

                          Того, что ссылка является, как ты выразился, модификатором типа. Хотя ты и сам знаешь, что в стандарте этого нет :)

                          Цитата
                          А могу я попросить тебя привести пруфы того, что ссылка (в c++) - это самостоятельный тип?

                          Что такое самостоятельный тип? И чем он отличается от несамостоятельного?

                          Ты считаешь, что в C++ нет типа int&?
                          Или что?

                          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                            Цитата D_KEY @
                            Что такое самостоятельный тип? И чем он отличается от несамостоятельного?

                            Забудь. Приведи пруфы того, что ссылка в C++ - это тип (в твоём понимании). :)

                            Цитата D_KEY @
                            Ты считаешь, что в C++ нет типа int&?

                            Я считаю, что в C++ есть тип int (относится к категории фундаментальных), и что есть декларации, тип которых может быть "ссылка на тип int". Это знаешь, как у Хайдеггера (в переводе) термин "бытие" может использоваться в пяти разных смыслах. :D

                            Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                              Цитата Flex Ferrum @
                              Цитата D_KEY @
                              Указатели являются типом. И, в отличие от ссылок, типом полноценным.

                              Да? А пруф можно? :)

                              Цитата
                              8.3.1 Pointers
                              1 In a declaration T D where D has the form * attribute-specier-seqopt cv-qualier-seqoptD1 [dcl.ptr] and the type of the identier in the declaration T D1 is derived-declarator-type-list T,then the type of the identier of D is derived-declarator-type-list cv-qualier-seq pointer to T.


                              Цитата
                              Может ещё и константность типом является? :)

                              const int является типом, да.

                              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                                D_KEY, ты ответь. const в С++ - это тип или нет? А volatile? А массив? А функция?

                                Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0789 ]   [ 16 queries used ]   [ Generated: 20.04.24, 07:08 GMT ]