На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (78) « Первая ... 16 17 [18] 19 20 ...  77 78  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    archimed7592
    Вот об этом я и подумал, тогда очень хорошо
      а реализации адаптеров типа compose1 и compose2 реализованные в STL от SGI и ряда других.
      Не будет?
      Поискал в драфте ничего не нашел или не там искал?
        Цитата Большой @
        а реализации адаптеров типа compose1 и compose2 реализованные в STL от SGI и ряда других.
        Не будет?

        А зачем, если теперь будет bind?
          Flex Ferrum

          Он полностью из boost
          а всякие bind2sd для совместимости оставили?
            Цитата Большой @
            а всякие bind2sd для совместимости оставили?

            Вроде да.
              ExpandedWrap disabled
                struct A { double x; };
                const A* a = new A();


              Почему здесь type is double
              ExpandedWrap disabled
                decltype(a->x) x3;


              а здесь type is const double&
              ExpandedWrap disabled
                decltype((a->x)) x4;


              Добавлено
              и в этом случае не разобрался
              ExpandedWrap disabled
                template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u);


              что это?
              ExpandedWrap disabled
                decltype((*(T*)0) + (*(U*)0))
                Большой, ты о чём? Откуда эти выкладки? Ссылку хоть дай.
                  Цитата Большой @
                  ExpandedWrap disabled
                    struct A { double x; };
                    const A* a = new A();

                  Почему здесь type is double
                  ExpandedWrap disabled
                    decltype(a->x) x3;

                  а здесь type is const double&
                  ExpandedWrap disabled
                    decltype((a->x)) x4;

                  Существует разница между типом объявленной сущности и типом выражения, в котором эта сущность участвует. Также существует разница между типом возврата функции и типом выражения, представляющего собой вызов этой функции. Например, здесь

                  ExpandedWrap disabled
                    int i;
                    int &ri = i;
                    int f();
                    int &g();
                    int &&h();
                     
                    struct A { int x; };
                    const A* a = new A();
                     
                    decltype(i)       x1; // int    (i - id-expression)
                    decltype((i))     x2; // int &
                    decltype(ri)      x4; // int &  (ri - id-expression)
                    decltype((ri))    x5; // int &
                    decltype(f())     x6; // int    (f() - function call)
                    decltype((f()))   x7; // int    (f() - function call)
                    decltype(g())     x8; // int &  (g() - function call)
                    decltype((g()))   x9; // int &  (g() - function call)
                    decltype(h())    x10; // int && (h() - function call)
                    decltype((h()))  x11; // int && (h() - function call)
                    decltype(a->x)   x12; // int    (a->x - class member access)
                    decltype((a->x)) x13; // const int &

                  тип объявленной сущности (переменной) i - это int, тип выражения i - это int,
                  тип объявленной сущности (ссылки) ri - int &, тип выражения ri - int,
                  тип возврата f - int, тип выражения f() - int,
                  тип возврата g - int &, тип выражения g() - int,
                  тип возврата h - int &&, тип выражения h() - int,
                  тип объявленной сущности A::x - int, тип выражения a->x - const int.

                  Помимо типа, у всякого выражения есть дополнительная характеристика - это принадлежность к lvalue или rvalue. Например, выражения i, ri и g() в примере выше - это lvalue, а f() и h() - это rvalue.

                  decltype даёт возможность выяснить как тип объявленной сущности или тип возврата функции, так и тип выражения вместе с принадлежностью его к lvalue или rvalue.

                  Если в качестве аргумента e указывается id-expression или class member access, то результат decltype(e) обозначает тип соответствующей объявленной сущности. При этом выражение e имеет тип std::remove_reference<decltype((e))>::type и является lvalue, если std::is_lvalue_reference<decltype((e))>::value равно true.

                  Если в качестве аргумента указывается вызов функции или вовлечение перегруженного оператора (круглые скобки вокруг будут игнорироваться), то результат decltype обозначает тип возврата функции, выбранной для вызова. При этом выражение e имеет тип std::remove_reference<decltype(e)>::type и является lvalue, если std::is_lvalue_reference<decltype(e)>::value равно true.

                  Обычно выяснять тип и принадлежность к lvalue поотдельности не требуется, т.е. результат decltype в большинстве случаев будет использоваться без каких-либо дополнительных манипуляций с ним.

                  Цитата Большой @
                  и в этом случае не разобрался
                  ExpandedWrap disabled
                    template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u);

                  что это?
                  ExpandedWrap disabled
                    decltype((*(T*)0) + (*(U*)0))

                  Здесь определяется тип суммы двух слагаемых, одно из которых - lvalue типа T, а другое - lvalue типа U. При определении типа аргумента decltype учитываются типы и принадлежность к lvalue подвыражений, из которых он состоит (при этом сами подвыражения не вычисляются). Имеем:
                  выражение (T*)0 - rvalue типа T* (в данном случае принадлежность к lvalue/rvalue ни на что не влияет),
                  выражение *(T*)0 - lvalue типа T
                  выражение (U*)0 - rvalue типа U* (в данном случае принадлежность к lvalue/rvalue ни на что не влияет),
                  выражение *(U*)0 - lvalue типа U
                  выражение (*(T*)0) + (*(U*)0) имеет тот же тип и ту же принадлежность к lvalue/rvalue, что и t + u.

                  Добавлено
                  Цитата archimed7592 @
                  Откуда эти выкладки?

                  Видимо, из черновика стандарта:

                  Цитата N2798 7.1.6.2 Simple type specifiers / 4
                  The type denoted by decltype(e) is defined as follows:

                  — if e is an id-expression or a class member access (5.2.5), decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a set of overloaded functions, the program is ill-formed;
                  — otherwise, if e is a function call (5.2.2) or an invocation of an overloaded operator (parentheses around e are ignored), decltype(e) is the return type of that the statically chosen function;
                  — otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;
                  — otherwise, decltype(e) is the type of e.

                  The operand of the decltype specifier is an unevaluated operand (Clause 5).

                  [ Example:
                  ExpandedWrap disabled
                    const int&& foo();
                    int i;
                    struct A { double x; };
                    const A* a = new A();
                    decltype(foo()) x1;      // type is const int&&
                    decltype(i) x2;          // type is int
                    decltype(a->x) x3;       // type is double
                    decltype((a->x)) x4;     // type is const double&
                  —end example ]
                  Сообщение отредактировано: Masterkent -
                    Цитата archimed7592 @
                    Большой, ты о чём? Откуда эти выкладки? Ссылку хоть дай.

                    из рабочего черновика :)
                      Masterkent
                      decltype() - что это вообще?
                      тип, функция, оператор? наверное врыжение результатом которого является тип.
                      Чтобы мозг зацепился за понятие этой темы необходимо это знать.
                      Сообщение отредактировано: Большой -
                        Цитата Большой @
                        врыжение результатом которого является тип.
                          decltype(expression) - это спецификатор типа, обозначающий тип :) Какой именно тип он обозначает, определяется правилами в 7.1.6.2/4. Типы не являются выражениями, поэтому decltype(expression) - это не выражение.
                            Цитата Masterkent @
                            decltype((i)) x2; // int &

                            почему?
                              Цитата Большой @
                              почему?

                              Потому что это подходит под 3-й случай:

                              Цитата
                              The type denoted by decltype(e) is defined as follows:

                              — if e is an id-expression or a class member access (5.2.5), decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a set of overloaded functions, the program is ill-formed;
                              — otherwise, if e is a function call (5.2.2) or an invocation of an overloaded operator (parentheses around e are ignored), decltype(e) is the return type of that the statically chosen function;
                              — otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;
                              — otherwise, decltype(e) is the type of e.

                              lvalue-ссылка здесь показывает, что выражение является lvalue, а не rvalue. Аналогичное соглашение используется для типа возврата из функции: результатом вызова функции является lvalue, если тип возврата является lvalue-ссылкой, иначе результатом будет rvalue. Таким образом, decltype может быть использован в записи типа возвращаемого значения.

                              ExpandedWrap disabled
                                int i;
                                enum { e };
                                 
                                // возвращает оригинальный объект i по lvalue-ссылке
                                decltype(i) get_i() { return i; }
                                 
                                // возвращает временный объект, равный e;
                                // e не является lvalue и не может быть возвращено по lvalue-ссылке
                                decltype(e) get_e() { return e; }
                                Masterkent
                                т.е. (i) интерпритируется как вызов функции?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (78) « Первая ... 16 17 [18] 19 20 ...  77 78


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0591 ]   [ 15 queries used ]   [ Generated: 8.09.25, 09:55 GMT ]