Я заметил, что gcc 5.0 отвергает следующий код, в то время как clang 3.6 принимает его.
template<int n>
struct I
{
typedef int Type;
};
template<typename T>
struct A
{
typedef I<sizeof(sizeof(T))>::Type Type;
};
Кажется, что два компилятора отличаются от того, является ли sizeof(sizeof(T))
зависимым от типа или зависящим от значения выражением. Если выражение было зависимым, то следует, что I<sizeof(sizeof(T))>
является зависимым типом, что означает необходимость typename
.
Это соответствует следующей формулировке в стандарте С++ 11:
[temp.dep.type]/8
Тип зависит, если он
- простой шаблон-идентификатор, в котором либо имя шаблона является параметром шаблона, либо любым из шаблонов аргументы - зависимый тип или выражение, зависящее от типа или зависящее от стоимости
[temp.dep.expr]/4
Выражения следующих форм никогда не зависят от типа (поскольку тип выражения не может быть зависимый):
sizeof unary-expression sizeof ( type-id )
[temp.dep.constexpr]/2
Выражения следующей формы зависят от стоимости, если унитарное выражение или выражение являются независимыми или идентификатор типа зависит:
sizeof unary-expression sizeof ( type-id )
Моя интерпретация заключается в том, что sizeof(T)
никогда не может быть зависимым от типа, то есть sizeof(sizeof(T))
никогда не может быть зависимым от типа или зависящим от значения.
Является ли это ошибкой в gcc?