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

    С точки зрения практики я не понимаю, зачем так было усложнять язык. Столько всяких сложных правил из-за ссылок в системе типов(перегрузка, шаблоны и их специализация, вывод типа аргумента шаблона, auto, decltype). На первый взгляд кажется, что это бессмысленное усложнение и ссылки просто как способ передачи/возврата позволяли решить исходные проблемы без такого усложнения. Но я могу ошибаться.

    С точки зрения теории вообще все грустно, ИМХО. Если рассматривать типы как множество значений + множество операций, то у T& и T совпадают оба множества. Если же мы возьмём какой-нибудь TAPL, где упор делается на классификации выражений, то все становится ещё непонятнее.

    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
      Цитата D_KEY @
      С точки зрения практики я не понимаю, зачем так было усложнять язык. Столько всяких сложных правил из-за ссылок в системе типов(перегрузка, шаблоны и их специализация, вывод типа аргумента шаблона, auto, decltype). На первый взгляд кажется, что это бессмысленное усложнение и ссылки просто как способ передачи/возврата позволяли решить исходные проблемы без такого усложнения. Но я могу ошибаться.
      Без ссылочного типа можно легко обойтись, но его наличие не мешает:
      ExpandedWrap disabled
        void foo(S& s) {
            auto& f = S.field;          // auto* const f = S.field;
            int c = f.a1 + f.a2 + f.a3; // int c = f->a1 + f->a2 + f->a3;
        }
      можно, конечно, указатель вместо ссылки, но, чисто эстетически ссылка мне нравится больше. Выглядит менее громоздко и как-то естественнее что ли. Может конечно привычка тянущаяся с плюсов.

      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
      Сообщение отредактировано: applegame -
        Цитата applegame @
        Цитата D_KEY @
        С точки зрения практики я не понимаю, зачем так было усложнять язык. Столько всяких сложных правил из-за ссылок в системе типов(перегрузка, шаблоны и их специализация, вывод типа аргумента шаблона, auto, decltype). На первый взгляд кажется, что это бессмысленное усложнение и ссылки просто как способ передачи/возврата позволяли решить исходные проблемы без такого усложнения. Но я могу ошибаться.
        Без ссылочного типа можно легко обойтись, но его наличие не мешает:
        ExpandedWrap disabled
          void foo(S& s) {
              auto& f = S.field;          // auto* const f = S.field;
              int c = f.a1 + f.a2 + f.a3; // int c = f->a1 + f->a2 + f->a3;
          }
        можно, конечно, указатель вместо ссылки, но, чисто эстетически ссылка мне нравится больше. Выглядит менее громоздко и как-то естественнее что ли. Может конечно привычка тянущаяся с плюсов.

        Тут так же нет смысла в типе. Можно разрешить объявлять переменные-ссылки. Поведение будет то же. У f будет иметь "обычный" тип.

        Добавлено
        Ссылка/значение - это "свойство" переменной, а не типа. Т.к. единственное, что тут затронуто - вопрос об идентификации объекта. При чем тут тип?

        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
          Возьмём классику жанра:
          ExpandedWrap disabled
            cout << "Hello World" << someBigObject << 123 << endl;

          Представим, что в с++ нет ссылок, но есть ref. Как этот код будет работать и как будет выглядеть оператор вывода в поток?

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

            Добавлено
            Цитата D_KEY @
            Тут так же нет смысла в типе. Можно разрешить объявлять переменные-ссылки. Поведение будет то же. У f будет иметь "обычный" тип.
            В таком смысле, наверное ты прав.

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

              Ты не мудри, ты пальцем покажи. И объясни. :)

              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                Цитата Flex Ferrum @
                Возьмём классику жанра:
                ExpandedWrap disabled
                  cout << "Hello World" << someBigObject << 123 << endl;

                Представим, что в с++ нет ссылок, но есть ref. Как этот код будет работать и как будет выглядеть оператор вывода в поток?

                Ну как-то так
                ExpandedWrap disabled
                  ref std::ostream operator << (ref std::ostream os, const char * str)
                  {
                      ...
                      return os;
                  }
                   
                  ref std::ostream operator << (ref std::ostream os, ref const my_type obj)
                  {
                      ...
                      return os;
                  }
                   
                  ref std::ostream operator << (ref std::ostream os, int x)
                  {
                      ...
                      return os;
                  }

                Работать будет так же, как и ссылки сейчас. Да, в принципе, можно и синтаксис с & оставить.
                Я что-то упускаю?

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

                  А что ему принципиально будет мешать работать?
                  Мне вот вообще интересно - что в языке сломается, если не будет правила "константная ссылка на временную переменную расширяет область видимости до области видимости ссылки". Точнее, даже два случая можно рассмотреть:
                  1) Что сломается, если это правило вообще убрать?
                  2) Что сломается, если расширить его и на неконстатные ссылки?
                  В случае 2) вроде должен компилиться такой код:
                  ExpandedWrap disabled
                    void foo(std::string &s)
                    {
                        s = "42";
                    }
                     
                    std::string bar()
                    {
                        return "24";
                    }
                     
                    foo(bar());

                  что вроде не так уж и плохо. Но скорей всего подобного же можно добиться и другими изменениями. А вот 1 - совершенно непонятно.

                  Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                    ОФФТОП.
                    надыбал забавные грабли в плюсах. Что выведет на экран следующая программа?
                    ExpandedWrap disabled
                      #include <iostream>
                      struct A {
                          A (int i) { std::cout << 'A';}
                      };
                       
                      struct B {
                          B (A a) { std::cout << 'B';}
                      };
                       
                      int main () {
                          int i = 1;
                          B b(A(i));
                          return 0;
                      }


                    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                    Сообщение отредактировано: applegame -
                      Цитата applegame @
                      ОФФТОП.
                      надыбал забавные грабли в плюсах. Что выведет на экран следующая программа?
                      ExpandedWrap disabled
                        #include <iostream>
                        struct A {
                            A (int i) { std::cout << 'A';}
                        };
                         
                        struct B {
                            B (A a) { std::cout << 'B';}
                        };
                         
                        int main () {
                            int i = 1;
                            B b(A(i));
                            return 0;
                        }

                      Этим граблям сто лет в обед. :) Против них {}-инициализацию и вводили. :)

                      Добавлено
                      Цитата D_KEY @
                      Работать будет так же, как и ссылки сейчас. Да, в принципе, можно и синтаксис с & оставить.

                      Что-то я тогда не пойму, в чём профит. Если и работать будет так же, и & можно оставить, то в чем отличие то будет? И *, и & всегда относились к имени переменной, а не к имени типа. Это ж букварь. :)

                      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                        Цитата Flex Ferrum @
                        Что-то я тогда не пойму, в чём профит.

                        Не будет такого типа как T &. Не будет такой специализации шаблона, например. Не будет странного типа без размера в языке.

                        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                          Цитата Flex Ferrum @
                          И *, и & всегда относились к имени переменной, а не к имени типа. Это ж букварь. :)

                          С указателем что то я не понял, с чего вдруг к имени переменной? Т.е. указатель это не тип данных? Тогда например взять void - если указатель относится к имени переменной, то почему void* ptr - я могу написать, а void p - не могу написать?
                          И опять же тот же typeid не выкидывает * при выводе типа.

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

                            Не будет такого типа как T &. Не будет такой специализации шаблона, например. Не будет странного типа без размера в языке.

                            А куда ж оно денется то? Вот захочешь ты передать в шаблонный метод параметр, который пришёл как ref, какого типа он будет?

                            Добавлено
                            Цитата KILLER @
                            Цитата Flex Ferrum @
                            И *, и & всегда относились к имени переменной, а не к имени типа. Это ж букварь. :)

                            С указателем что то я не понял, с чего вдруг к имени переменной? Т.е. указатель это не тип данных? Тогда например взять void - если указатель относится к имени переменной, то почему void* ptr - я могу написать, а void p - не могу написать?
                            И опять же тот же typeid не выкидывает * при выводе типа.

                            Говорю же - это букварь. :) Если написать:
                            int* p, c;
                            То p будет указателем, а c - нет.

                            Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                              Flex Ferrum, можешь кодом?

                              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                                Цитата Flex Ferrum @
                                А куда ж оно денется то? Вот захочешь ты передать в шаблонный метод параметр, который пришёл как ref, какого типа он будет?

                                Параметр, который пришел как ref T будет иметь тип T, соответственно и в шаблонный метод он придет как T.
                                ExpandedWrap disabled
                                  template<T> void foo(T t) {}
                                  template<T> void foo(ref T t) {}
                                   
                                  void bar(ref int a) {
                                      foo(a);
                                      fooRef(a);
                                  }


                                Добавлено
                                Цитата Flex Ferrum @
                                Этим граблям сто лет в обед. :)
                                Но забавляют до сих пор. :D

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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0540 ]   [ 15 queries used ]   [ Generated: 8.05.24, 17:35 GMT ]