
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.120] |
![]() |
|
Страницы: (78) « Первая ... 16 17 [18] 19 20 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#256
,
|
|
|
archimed7592
Вот об этом я и подумал, тогда очень хорошо |
Сообщ.
#257
,
|
|
|
а реализации адаптеров типа compose1 и compose2 реализованные в STL от SGI и ряда других.
Не будет? Поискал в драфте ничего не нашел или не там искал? |
Сообщ.
#258
,
|
|
|
Цитата Большой @ а реализации адаптеров типа compose1 и compose2 реализованные в STL от SGI и ряда других. Не будет? А зачем, если теперь будет bind? |
Сообщ.
#259
,
|
|
|
Flex Ferrum
Он полностью из boost а всякие bind2sd для совместимости оставили? |
Сообщ.
#260
,
|
|
|
Цитата Большой @ а всякие bind2sd для совместимости оставили? Вроде да. |
Сообщ.
#261
,
|
|
|
![]() ![]() struct A { double x; }; const A* a = new A(); Почему здесь type is double ![]() ![]() decltype(a->x) x3; а здесь type is const double& ![]() ![]() decltype((a->x)) x4; Добавлено и в этом случае не разобрался ![]() ![]() template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u); что это? ![]() ![]() decltype((*(T*)0) + (*(U*)0)) |
![]() |
Сообщ.
#262
,
|
|
Большой, ты о чём? Откуда эти выкладки? Ссылку хоть дай.
|
Сообщ.
#263
,
|
|
|
Цитата Большой @ ![]() ![]() struct A { double x; }; const A* a = new A(); Почему здесь type is double ![]() ![]() decltype(a->x) x3; а здесь type is const double& ![]() ![]() decltype((a->x)) x4; Существует разница между типом объявленной сущности и типом выражения, в котором эта сущность участвует. Также существует разница между типом возврата функции и типом выражения, представляющего собой вызов этой функции. Например, здесь ![]() ![]() 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 в большинстве случаев будет использоваться без каких-либо дополнительных манипуляций с ним. Цитата Большой @ и в этом случае не разобрался ![]() ![]() template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u); что это? ![]() ![]() 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: ![]() ![]() 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& |
Сообщ.
#264
,
|
|
|
Цитата archimed7592 @ Большой, ты о чём? Откуда эти выкладки? Ссылку хоть дай. из рабочего черновика ![]() |
Сообщ.
#265
,
|
|
|
Masterkent
decltype() - что это вообще? тип, функция, оператор? наверное врыжение результатом которого является тип. Чтобы мозг зацепился за понятие этой темы необходимо это знать. |
![]() |
Сообщ.
#266
,
|
|
Цитата Большой @ врыжение результатом которого является тип. |
Сообщ.
#267
,
|
|
|
decltype(expression) - это спецификатор типа, обозначающий тип
![]() |
Сообщ.
#268
,
|
|
|
Цитата Masterkent @ decltype((i)) x2; // int & почему? |
Сообщ.
#269
,
|
|
|
Цитата Большой @ почему? Потому что это подходит под 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 может быть использован в записи типа возвращаемого значения. ![]() ![]() int i; enum { e }; // возвращает оригинальный объект i по lvalue-ссылке decltype(i) get_i() { return i; } // возвращает временный объект, равный e; // e не является lvalue и не может быть возвращено по lvalue-ссылке decltype(e) get_e() { return e; } |
Сообщ.
#270
,
|
|
|
Masterkent
т.е. (i) интерпритируется как вызов функции? |