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

    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
      Я конечно подзабыл плюсы, но разве вот это не кака?
      Цитата
      std::string* hw0 = &HelloWorld();
      const std::string& hw = HelloWorld();

      Ты же пытаешься получить указатель и ссылку на временный объект, возвращенный из функции?

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

        Да. Но тут есть нюанс, завязанный на то, что ссылки - это не указатели.

        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
          Цитата Flex Ferrum @
          Да. Но тут есть нюанс, завязанный на то, что ссылки - это не указатели.
          Я не знаю, что будет выведено на экран, так как у тебя тут сплошной UB. Подозреваю, что если повезет, то выведет четыре раза "Hello World!". Ну или крашнется. Можно запускать компилятор?

          Добавлено
          насколько я понял только в этой строке все норм:
          ExpandedWrap disabled
            auto hw2 = TakingRef(std::string("Hello World!"));

          потому что будет создана копия с временного объекта переданного в TakingRef по константной ссылке, и эта копия будет сохранена в hw2;

          Добавлено
          Цитата Flex Ferrum @
          После этого попробуй замутить move-семантику без привлечения rv-ссылок.
          Дык жили же столько лет без rv-ссылок. :D не это ли подтверждение, что без них можно обойтись?

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

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

              блин, наверное, невнятно выразился, поправляю:
              Цитата _lcf_ @
              ну если про использование, то дальше что-то типа:


              ExpandedWrap disabled
                for (auto t : enum_range (some_class_enum_mode::COUNT))
                    {
                      some_class *&sc = get_class_for_mode (some_class_enum_mode(t));
                      if (sc)
                        {
                          sc = new some_class;
                        }
                    }


              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
              Сообщение отредактировано: _lcf_ -
                Цитата applegame @
                Ты же пытаешься получить указатель и ссылку на временный объект, возвращенный из функции?

                Константная ссылка продлевает жизнь объекта до времени жизни самой ссылки.

                Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                  да, как альтернатива той портянке, что я привел - передача указателя на указатель в параметрах функции. да вот беда, если для some_class есть шаблонный врапер с чейнами...

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

                    А зачем вообще этот нюанс ввели?

                    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                      Цитата applegame @
                      Я не знаю, что будет выведено на экран, так как у тебя тут сплошной UB. Подозреваю, что если повезет, то выведет четыре раза "Hello World!".

                      В этом коде нет UB. Но есть две ошибки компиляции, вызванные тем, что нельзя брать адрес временного объекта - ни при возврате значения из функции, ни при передаче значения в функцию. А вот константные ссылки брать можно. И такой пример - не единственный. Как правильно было замечено выше, константная ссылка на возвращённый объект продлевает его время жизни до выхода из скоупа. То есть интерпретируется компилятором не как указатель, а как объект целиком. Весело, правда? :) Но так то конечно - можно продолжать думать, что ссылки - это те же указатели, вид в профиль. :)
                      Цитата applegame @
                      Дык жили же столько лет без rv-ссылок.

                      Угу. Жили, кололись, плакали и кушали кактус. Хорошо жили. Ага. :)

                      Добавлено
                      Цитата OpenGL @
                      А зачем вообще этот нюанс ввели?

                      А вот кабы я знал.

                      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                        Цитата Flex Ferrum @
                        Но так то конечно - можно продолжать думать, что ссылки - это те же указатели, вид в профиль. :)

                        А то, что это костыль в системе типов можно думать? :)

                        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                          Цитата D_KEY @
                          А то, что это костыль в системе типов можно думать?

                          Тебе в который раз повторить, что ссылка типом не является? :)

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

                            Тебе в который раз повторить, что ссылка типом не является? :)

                            Ты лучше пруф приведи :)

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

                              Цитата D_KEY @
                              Ты лучше пруф приведи :)

                              Как я понимаю - ссылка является частью типа данных, но не каким то конкретным типом. Вот например, из того же Маерса, самое начало:
                              Цитата

                              Простейшая ситуация - когда ParamType является ссылочным типом или типом ука­зателя, но не универсальной ссылкой. В этом случае вывод типа работает следующим образом.
                              1. Если типом expr является ссылка, ссылочная часть игнорируется.
                              2. Затем выполняется сопоставление типа expr с ParamType для определения T.
                              Например, если у нас имеются шаблон
                              ExpandedWrap disabled
                                template<typename  Т>
                                void  f( T&  param) ;  //  param  представляет  собой  ссыпку

                              и объявления переменных

                              ExpandedWrap disabled
                                int  х  =  27 ;  // х  имеет  тип  int
                                const  int  сх  =  х;  // сх  имеет  тип  const  int
                                const  int&  rx  =  х;  //  rx  является  ссыпкой  на  х  как  на  const  int

                              то выводимые типы для pa ram и Тв разл ичных выводах будут следующ ими:

                              ExpandedWrap disabled
                                f (х) ;    //  Т  - int ,  тип  param  - int&
                                f( cx) ;  //  Т  - const  int ,  тип  param  - coпst  int&
                                f( rx) ;  //  Т  - const  int ,  тип  param  - const  int&


                              Вот из стандарта:
                              Цитата

                              11.3.2 References [dcl.ref]
                              1
                              In a declaration T D where D has either of the forms
                              & attribute-specifier-seqopt D1
                              && attribute-specifier-seqopt D1
                              and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type of the
                              identifier of D is “derived-declarator-type-list reference to T”. The optional attribute-specifier-seq appertains
                              to the reference type
                              . Cv-qualified references are ill-formed except when the cv-qualifiers are introduced
                              through the use of a typedef-name (10.1.3, 17.1) or decltype-specifier (10.1.7.2), in which case the cv-qualifiers
                              are ignored. [ Example:
                              typedef int& A;
                              const A aref = 3; // ill-formed; lvalue reference to non-const initialized with rvalue
                              The type of aref is “lvalue reference to int”, not “lvalue reference to const int”. — end example ] [ Note:
                              A reference can be thought of as a name of an object. —end note ] A declarator that specifies the type
                              “reference to cv void” is ill-formed.
                              2
                              A reference type that is declared using & is called an lvalue reference , and a reference type that is declared
                              using && is called an rvalue reference. Lvalue references and rvalue references are distinct types. Except
                              where explicitly noted, they are semantically equivalent and commonly referred to as references.
                              3
                              [ Example:

                              Ссылка - это скорее атрибут типа, чем тип. Нет ссылочного типа данных в С++. Есть указатели, ссылки - это атрибут типа.

                              Добавлено
                              А как там уже их компилятор оптимизирует - это его личное дело, хоть пусть новый указатель заводит. Это конкретная реализация компилятора. Главное что бы поведение этих ссылок отвечало требованию стандарта. :-? (ИМХО)

                              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                              Сообщение отредактировано: KILLER -
                                Цитата KILLER @
                                the type of the
                                identifier of D is “derived-declarator-type-list reference to T”.
                                ...
                                The type of aref is “lvalue reference to int”,

                                :)

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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0466 ]   [ 14 queries used ]   [ Generated: 19.05.24, 23:21 GMT ]