O tamanho de aninhado duas vezes pode ser uma expressão dependente?
Notei que o gcc 5.0 rejeita o código a seguir, enquanto o clang 3.6 o aceita.
template<int n>
struct I
{
typedef int Type;
};
template<typename T>
struct A
{
typedef I<sizeof(sizeof(T))>::Type Type;
};
Os dois compiladores parecem diferir sesizeof(sizeof(T))
é uma expressão dependente de tipo ou dependente de valor. Se a expressão fosse dependente, segue-se queI<sizeof(sizeof(T))>
é um tipo dependente, o que significa quetypename
deve ser necessário.
Isso é coberto pelo seguinte texto no padrão C ++ 11:
[temp.dep.type] / 8
Um tipo é dependente se for
um ID-modelo simples, no qual o nome do modelo é um parâmetro do modelo ouqualquer um dos argumentos do modelo é um tipo dependente ou uma expressão que depende do tipo ou depende do valor[temp.dep.expr] / 4
As expressões dos seguintes formulários nunca dependem do tipo (porque o tipo da expressão não pode ser dependente):
sizeof unary-expression
sizeof ( type-id )
[temp.dep.constexpr] / 2
Expressões da seguinte forma dependem de valor se a expressão unária ou expressão for digitada independente ou a identificação de tipo for dependente:
sizeof unary-expression
sizeof ( type-id )
Minha interpretação é quesizeof(T)
nunca pode ser dependente do tipo, o que significasizeof(sizeof(T))
nunca pode ser dependente de tipo ou de valor.
Isso é um bug no gcc?