На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (11) [1] 2 3 ...  10 11 все  ( Перейти к последнему сообщению )  
> Баллада о ссылках в С++
    Цитата applegame @
    ExpandedWrap disabled
      void foo(T)(T x) if (is(T == class)) {
          ....
      }
    Ок. У меня есть крутой класс complex_number. Покажи примерную схему, как мне его реализовать, чтобы в него легко можно было передавать и float, и class cool_real_number_having_long_mantissa_with_great_exponent.

    Добавлено
    Цитата D_KEY @
    Ссылки в С++ это некий уход от семантики значений.
    Ну как бы да. Это как раз то, что выше я обозвал "любой тип можно сделать ссылочным". Нужны значения, не используем &, нужна ссылочность, используем. Я этим легко управляю.

    Добавлено
    Цитата D_KEY @
    Что является значением типа T&?
    T и является, разве нет?

    Добавлено
    Цитата D_KEY @
    Вот ссылки в C++ мне совсем не нравятся. Иногда даже думаю, не лучше ли бы было, если бы они не являлись самостоятельными типами, а были просто спецификаторами для параметров функции/возвращаемого значения
    Тогда ссылочных типов в Плюсах не было бы. Были бы простые модификаторы типа передачи параметров.

    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
      Цитата D_KEY @
      Ссылки в С++ это некий уход от семантики значений. Что является значением типа T&?
      Указатель?

      Добавлено
      Цитата Qraizer @
      Ок. У меня есть крутой класс complex_number. Покажи примерную схему, как мне его реализовать, чтобы в него легко можно было передавать и float, и class cool_real_number_having_long_mantissa_with_great_exponent.
      Не совсем понимаю, что именно тебе нужно. Но подозреваю, что это делается аналогично плюсам. Например, специализацией перегруженных операторов.

      Добавлено
      Цитата Qraizer @
      T и является, разве нет?
      При присваивании ссылоки другой ссылке T не копируется, а при присваивании "обычной" переменной копируется. То есть значение зависит от контекста.

      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
        Цитата Qraizer @
        Цитата D_KEY @
        Ссылки в С++ это некий уход от семантики значений.
        Ну как бы да.

        Ну вот я про это и говорил. В языке с "чистой" семантикой значений есть проблема с тем, чтобы определить функцию разыменования. Но тут, как мне кажется, достаточно было бы спецификаторов.
        ExpandedWrap disabled
          ref int foo(int *x)
          {
              return *x;
          }

        ref int - это не тип, тип тут int. ref - способ передачи/возврата.

        Цитата
        Тогда ссылочных типов в Плюсах не было бы. Были бы простые модификаторы типа передачи параметров.

        Вот я не понимаю, так ли это плохо...

        Добавлено
        Цитата applegame @
        Цитата D_KEY @
        Ссылки в С++ это некий уход от семантики значений. Что является значением типа T&?
        Указатель?

        И какие операции над "значениями" типа ссылки я могу делать? Да у ссылки даже размера нет :D

        Добавлено
        Цитата applegame @
        Цитата D_KEY @
        Можешь пример какой-нибудь привести показательный?
        Вряд ли, не помню когда это было. А в последнее время как-то не возникало необходимости в ссылках. У ссылки в плюсах есть серьезное отличие от указателя: ссылка требует обязательной инициализации, то бишь без специальных ухищрений ссылка не может ссылаться на несуществующий объект (уничтожение объекта после создания ссылки не учитываем), а вот указатель может указывать на null или вообще в случайное место.

        Это отдельная тема. Некий nullable/option/maybe нужен.

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

          А никаких. И не должен мочь, к слову.

          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
            Цитата Flex Ferrum @
            А никаких. И не должен мочь, к слову.
            Почему никаких? А копирование?
            ExpandedWrap disabled
              void foo(int& x) {
                  int& y = x; // какая операция здесь происходит?
              }


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

              А никаких. И не должен мочь, к слову.

              Тогда зачем ссылки в языке в качестве типов?

              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                Цитата D_KEY @
                Да у ссылки даже размера нет :D
                Ну, де-факто он есть и равен размеру указателя.
                https://glot.io/snippets/ergz7vqc42
                Хз как оно в стандарте описано, implementation specific?

                Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                Сообщение отредактировано: applegame -
                  applegame, возьми sizeof, попробуй сделать массив ссылок.

                  Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                    В D, кстати, "указатель" на класс размер как раз таки имеет и он равен размеру указателя, что сам по себе еще тот WAT:
                    https://glot.io/snippets/ergzfr193j
                    Цитата D_KEY @
                    applegame, возьми sizeof, попробуй сделать массив ссылок.
                    Да, я знаю, что это невозможно:
                    Цитата СтандартЪ
                    There shall be no references to references, no arrays of references, and no pointers to references.


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

                      Ты меня расстраиваешь. Ссылка - это не отдельный тип, а модификатор типа. Точно так же как const или volatile. :) Тебя ведь не удивляет, что const-объект ты не можешь модифицировать? Тогда почему тебя удивляет, что для ссылки запрещены некоторые другие наборы операций? :)

                      Добавлено
                      Ссылочный тип в C++ - это способ задать синоним переменной. Что будет под капотом этого синонима в данном конкретном месте программы - решает компилятор.

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

                        Ты меня расстраиваешь. Ссылка - это не отдельный тип, а модификатор типа. Точно так же как const или volatile. :) Тебя ведь не удивляет, что const-объект ты не можешь модифицировать? Тогда почему тебя удивляет, что для ссылки запрещены некоторые другие наборы операций? :)

                        Добавлено
                        Ссылочный тип в C++ - это способ задать синоним переменной. Что будет под капотом этого синонима в данном конкретном месте программы - решает компилятор.

                        Не вижу тут ответа на мой вопрос :)

                        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                          Цитата D_KEY @
                          Не вижу тут ответа на мой вопрос

                          Ещё раз. Ссылка - это не отдельный тип (как, например, std::reference_wrapper). Это модификатор имеющегося типа. Поэтому сложно дать ответ на вопрос, который поставлен некорректно.

                          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                            Цитата Flex Ferrum @
                            Цитата D_KEY @
                            Не вижу тут ответа на мой вопрос

                            Ещё раз. Ссылка - это не отдельный тип (как, например, std::reference_wrapper). Это модификатор имеющегося типа. Поэтому сложно дать ответ на вопрос, который поставлен некорректно.

                            Хорошо. Зачем ссылки в языке в качестве модификатора типа?

                            Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                              Цитата D_KEY @
                              Зачем ссылки в языке в качестве модификатора типа?

                              Затем, чтобы была возможность создавать алиасы для объектов. Не указатели на объекты, которые ведут себя как объекты-значения, а полноценные алиасы, которые обрабатываются компилятором так, как он считает нужным. Работая со ссылкой ты всегда работаешь с оригинальным объектам.

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

                                Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (11) [1] 2 3 ...  10 11 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0483 ]   [ 16 queries used ]   [ Generated: 28.03.24, 12:26 GMT ]