Ответ 1
Я использую проект post-N4296.
typedef I<sizeof(sizeof(T))>::Type Type;
typename
требуется, если спецификатор вложенных имен I<..>
зависит от параметра шаблона [temp.res]/5. Итак, I<..>
зависит?
[temp.dep.type]/9 Тип зависит, если он
- [...]
- (9.7) идентификатор простого шаблона, в котором либо имя шаблона является параметром шаблона, либо любой из аргументов шаблона является зависимым тип или выражение, зависимое от типа или зависящее от стоимости, или [...]
I<..>
- это простой шаблон-id, аргумент шаблона - выражение. Является ли это выражение sizeof(sizeof(T))
зависимым от типа или зависящим от значения?
Выражение sizeof(sizeof(T))
можно разбить на следующие выражения:
expression form =============================================== T type-id sizeof(T) sizeof ( type-id ) (sizeof(T)) ( expression ) sizeof(sizeof(T)) sizeof unary-expression
T
не является выражением, но я оставлю его в списке позже. Примечание в круглых скобках: первичное выражение может быть выражением в скобках (общее). Унарное выражение может быть постфиксным выражением, которое может быть основным выражением, поэтому оно также может быть заключено в круглые скобки.
Обозначенное в скобках выражение (X)
зависит, если X
зависит:
[temp.dep.expr]/1 За исключением случаев, описанных ниже, выражение зависит от типа, если любое подвыражение зависит от типа.
[temp.dep.constexpr]/1 За исключением случаев, описанных ниже, константное выражение зависит от значения, если любое подвыражение зависит от значения.
В общем случае выражения sizeof
никогда не являются типа -зависимыми, поскольку они всегда выдает значение типа std::size_t
:
[temp.dep.expr]/4 Выражения следующих форм никогда не зависят от типа (поскольку тип выражения не может быть зависимым):
[...] sizeof unary-expression sizeof ( type-id )
Однако значение, которое они дают, может зависеть от параметра шаблона:
[temp.dep.constexpr]/2 Выражения из следующей формы зависят от значения, если унитарное выражение или выражение зависят от типа или идентификатор типа:
sizeof unary-expression sizeof ( type-id )
expression form value-dep? type-dep? ======================================================================= T type-id no yes sizeof(T) sizeof ( type-id ) yes no (sizeof(T)) ( expression ) yes no sizeof(sizeof(T)) sizeof unary-expression no no
Так как T
тип -зависимый, sizeof(T)
становится значением -зависимым. Однако, поскольку (sizeof(T))
не тип -зависимый, sizeof(sizeof(T))
вообще не зависит.