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;
};
2 つのコンパイラsizeof(sizeof(T))
は、式が型依存か値依存かによって異なるようです。式が従属型である場合I<sizeof(sizeof(T))>
は、従属型であるということになります。つまり、必須であるtypename
必要があります。
これは、C++11 標準の次の文言でカバーされています。
[温度依存タイプ]/8
ある場合、型は従属です。
- テンプレート名がテンプレート パラメータであるか、いずれかのテンプレート引数が依存型または型依存または値依存の式である simple-template-id
[温度.dep.expr]/4
次の形式の式は型に依存しません (式の型は依存できないため)。
sizeof unary-expression sizeof ( type-id )
[temp.dep.constexpr]/2
次の形式の式は、unary-expression または expression が typedependent であるか、type-id が依存している場合、value-dependent です。
sizeof unary-expression sizeof ( type-id )
私の解釈では、それsizeof(T)
は型に依存するsizeof(sizeof(T))
ことはありません。つまり、型に依存したり、値に依存したりすることはできません。
これは gcc のバグですか?