На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (78) « Первая ... 2 3 [4] 5 6 ...  77 78  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Цитата archimed7592 @
    В двух словах: для того, чтобы отличать временные объекты от обычных, что может дать прирост производительности(при соответствующей поддержке со стороны реализации класса).

    Да я понял зачем они.. читал N раз (N > 2) ;)

    имхо. Если есть ссылки на rvalue, то должны быть и указатели на rvalue. Почему? А почему бы и нет собственно?
    былоб полезно.. и
    если взятие адреса у T&& дает T*.. то вместо T& var = const_cast<T&> (rvalueRef);
    можно написать T& var = *&rvalueRef;//а это не круто, для типизированного языка как ЭС с плюсами.

    Ладно. Свое имхо сказал. Спорить не будем.. а то правда не флейм схожу уже..
    Сообщение отредактировано: LuckLess -
      Цитата LuckLess @
      имхо. Если есть ссылки на rvalue, то должны быть и указатели на rvalue. Почему? А почему бы и нет собственно?

      Ты сможешь придумать практическое применение эти "указателям на rvalue"? Мне вот в голову ничего не приходит...



      Цитата LuckLess @
      если взятие адреса у T&& дает T*.. то вместо T& var = const_cast<T&> (rvalueRef);

      Не понял при чем тут const_cast.
      Понял чего ты хотел этим показать, но не уверен, что ты получишь то чего хотел...


      Цитата LuckLess @
      можно написать T& var = *&rvalueRef;//а это не круто, для типизированного языка как ЭС с плюсами.

      Ты получишь точно такой же rvalue.
      Попробуй в студии написать ostream &s = *reinterpret_cast< ostream * >(NULL); - получишь еггог т.к. нельзя делать неконстантные ссылки на временные(читай rvalue) объекты.
      Сообщение отредактировано: archimed7592 -
        Цитата archimed7592 @
        Ты получишь точно такой же rvalue.
        Попробуй в студии написать ostream &s = *reinterpret_cast< ostream * >(NULL); - получишь еггог т.к. нельзя делать неконстантные ссылки на временные(читай rvalue) объекты.

        непроблема, яж псевдокодом написал.
        ExpandedWrap disabled
          ...
          T&& rvalueRef;
          T* ptr = &rvalueRef;//ok
          T& lvalueRef = *ptr;//ravlue превратился в lvalue

        Цитата archimed7592 @

        Ты сможешь придумать практическое применение эти "указателям на rvalue"?

        Придумал уже)
        ExpandedWrap disabled
          ...
          T&& rvalueRef;
          T* ptr = &rvalueRef;//Ошибка! ravlue превратился в lvalue! Низзя так!
          rvalue T* ptrRValue = &rvalueRef;//ok
          T& lvalueRef = *ptr;//ravlue не превратился в lvalue
          const T& constRef = *ptrRValue ;//ok
          T&& rvalueRef2 = *ptrRValue ;//ok
          T& lvalueRef = *ptrRValue;//ошибка низзя так.
        Сообщение отредактировано: LuckLess -
          LuckLess, не знаю насколько это можно считать разумным решением, но на данный момент стандарт трактует любую именнованную rvalue-ссылку как lvalue-ссылку. Т.е. на данный момент не нужно даже с указателями извращаться, чтобы "обмануть" компилятор.
          ExpandedWrap disabled
            void f(T & a);
             
            void g(T && a)
            {
                f(a); // well-formed - несмотря на то, что "a" является как бы rvalue, мы без особых проблем передаём его по неконстантной lvalue-ссылке
                f(std::fwd(a)); // ill-formed - rvalue можно передавать только по константной lvalue-ссылке
            }
             
             
            T && a = ...;
            f(a); // well-formed


          Могу добавить, что возможно, мы просто ещё не привыкли. С практикой всё встанет на свои места и многие из принятых комитетом решений станут понятными и "очевидными"("как это мы раньше этого не понимали - это же очевидно" :rolleyes:).
          ИМХО, rvalue-ссылки примерно так же опасны, как и использование auto_ptr, но они того стоят.
            не.. ну с такой постоновкой я к rvalue ссылкам вообще негативно отношусь. ПОнятно что иногда, для оптимизации.. можно допустить опасные синтаксические конструкции.. но когда эти синтаксические конструкции можно сделать безопасными, а их безопасными не делают.. этого я не понимаю вовсе..

            Добавлено
            за что боролись.. на то и напоролись блин..
            ExpandedWrap disabled
              void f (double& d)
                 {
                 d = .555;
                 }
               
              void ff (double&& d)
                 {
                 f (d);
                 }
               
               
              int main ()
                 {
                 int i = 0;
                 ff (i);
                 }


            Добавлено
            :'(
            Сообщение отредактировано: LuckLess -
              LuckLess, у всего есть rationale... Эти rvalue-ссылки 5 лет "вылизывали".
                Цитата archimed7592 @
                LuckLess, у всего есть rationale... Эти rvalue-ссылки 5 лет "вылизывали".

                Ну.. у них еще 2 года есть.. :rolleyes:
                  Цитата LuckLess @
                  за что боролись.. на то и напоролись блин..

                  С чего ты взял, что это скомпилируется? :)
                  AFAIK, неявного каста из lvalue[-reference] of T в nonconst rvalue-reference of U нету.

                  Цитата LuckLess @
                  Ну.. у них еще 2 года есть.. :rolleyes:

                  Ну там пока до конца не вылижут, как правило в WP не включают :)

                  Добавлено
                  И не два года, а меньше, чем полгода(см. первый пост, начало) ;)
                    Цитата archimed7592 @
                    AFAIK, неявного каста из lvalue[-reference] of T в nonconst rvalue-reference of U нету.

                    Гм... тут у нас int конвертируется в double и получается временная переменная типа double&& вродь все правильно да??

                    Цитата archimed7592 @
                    стандарт трактует любую именнованную rvalue-ссылку как lvalue-ссылку.

                    вот и все собстно..

                    Или мне пойти еще раз перечитать про rvalue reference.. ?? :D

                    Добавлено
                    Цитата archimed7592 @
                    И не два года, а меньше, чем полгода(см. первый пост, начало) ;)

                    так я и смотрел..
                    Цитата

                    К октябрю 2007 года комитет запланировал публикацию законченного черновика стандарта C++09(который будет доступен публике для рассмотрения и критики).
                    В октябре 2008 комитет внесёт окончательные коррективы в стандарт(и вот тут они одумаются!! :rolleyes:) и, наконец, на 2009 год(а тут уже все будет правильно... :rolleyes:) запланированна публикация нового стандарта "ISO/IEC 14883(2009): Programming Language C++".
                      Цитата LuckLess @
                      Гм... тут у нас int конвертируется в double и получается временная переменная типа double&& вродь все правильно да??

                      С чего ты взял, что у нас тут что-то конвертируется. Для того, чтобы чего-то конвертировалось, компилятор должен решить, что "надо бы сконвертировать". А решения он принимает на основе набора правил из стандарта и правила "надо бы конвертировать lvalue of T в rvalue-reference of U", AFAIK, нету.

                      Добавлено
                      Цитата LuckLess @
                      так я и смотрел..

                      Ну там же четко сказано, что в 2008 комитет только внесёт коррективы(ну мало ли каких там Core/Library Defect Issues найдут).
                      Кардинально менять ничего не будут.
                      Потом до 2009 будут слушать нотации ISO по формальности языка и исправлять некоторые места на более формальный язык(не меняя смысла сказанного). Ну и в 2009 выпустят С++09.
                        Цитата archimed7592 @
                        А решения он принимает на основе набора правил из стандарта и правила "надо бы конвертировать lvalue of T в rvalue-reference of U", AFAIK, нету.

                        тогда rvalue ссылка совсем не похожа на lvalue ссылку и использовать && для нее я теперь вижу еще меньше смысла..
                          Цитата LuckLess @
                          тогда rvalue ссылка совсем не похожа на lvalue ссылку

                          а для lvalue-ссылки такое правило есть? ;)
                          ExpandedWrap disabled
                            void f(double &);
                             
                            int i(0);
                            f(i); // ill-formed
                            Цитата archimed7592 @
                            а для lvalue-ссылки такое правило есть? ;)

                            есть
                            Цитата

                            A variable declared to be a T&, that is “reference to type T (8.3.2), shall be initialized by an object, or function, of type
                            T or by an object that can be converted into a T.

                            Цитата archimed7592 @
                            f(i); // ill-formed

                            не должно работать по другой причине
                            Цитата

                            A reference to type “cv1 T1” is initialized by an expression of type “cv2 T2” as follows:
                            — If the initializer expression
                            — is an lvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or
                            ...
                            An expression which holds a temporary object resulting from a cast to a nonreference type is an rvalue(this


                            а если ссылка const срабатывает
                            Цитата

                            Otherwise, the reference shall be to a non-volatile const type


                            но для T&&
                            это
                            — is an lvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or
                            должно заменится на
                            — is an rvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or
                            как мне кажется..

                            пойду какнить прокурю весь ман по новым ссылкам на rvalue когда время появится..

                            Добавлено
                            не.. если нельзя написать
                            void f (T2&&);
                            ...
                            T1 t;
                            f (t);//где есть преобразование T1 в T2.
                            то это нововведение выглядит вообще сомнительным. Это должно быть разрешено.
                              Вот все изменения:
                              Цитата

                              An expression which holds a temporary object resulting from a cast to a nonreference typetype other than an lvalue-reference type is an rvalue (this includes the explicit creation of an object using functional notation (5.2.3)).
                              ---
                              A variable declared to be a T& or T&&, that is ``reference to type T'' (dcl.ref), shall be initialized by an object, or function, of type T or by an object that can be converted into a T.
                              ----
                              Otherwise, the reference shall be an lvalue-reference to a non-volatile const type (i.e., cv1 shall be const), or shall be an rvalue-reference.

                              Только не понял при чём тут reference-compatibility... она вроде для отношений наследования...
                                Цитата archimed7592 @
                                Только не понял при чём тут reference-compatibility... она вроде для отношений наследования...

                                Цитата

                                is an lvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or

                                битовые поля то уж точно не имеют отножение к наследованию :rolleyes:

                                Цитата archimed7592 @
                                Otherwise, the reference shall be an lvalue-reference to a non-volatile const type (i.e., cv1 shall be const), or shall be an rvalue-reference.

                                Вот.. эта добавочка позволит компилироватся коду
                                ExpandedWrap disabled
                                  void f (T2&&);
                                  ...
                                  T1 t;
                                  f (t);//где есть преобразование T1 в T2.


                                ну.. мужики не глупые писали.. навернякак гдето есть добавочка которая не даст сделать
                                ExpandedWrap disabled
                                  void f (double& d)
                                     {
                                     d = .555;
                                     }
                                   
                                  void ff (double&& d)
                                     {
                                     f (d);
                                     }
                                   
                                   
                                  int main ()
                                     {
                                     int i = 0;
                                     ff (i);
                                     }

                                и
                                ExpandedWrap disabled
                                  T&& rvalueRef;
                                  T* ptr = &rvalueRef;//ok
                                  T& lvalueRef = *ptr;//ravlue превратился в lvalue


                                хотя && будет резать мой глаз всю жизнь :lool: :lool:

                                Добавлено
                                вот подумал еще... я бы вообще не назвал бы это ссылкой..
                                пусть это будет именованный временный объект. без &&, а со значком какимнибудь.. или ключевым словом.
                                Тогда терминология бы упростилась. Имхо имхо имхо...
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (78) « Первая ... 2 3 [4] 5 6 ...  77 78


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0613 ]   [ 15 queries used ]   [ Generated: 17.06.25, 04:59 GMT ]