我注意到 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
应该是必需的。
C++11 标准中的以下措辞涵盖了这一点:
[温度.dep.type]/8
一个类型是依赖的,如果它是
- 一个 simple-template-id,其中模板名称是模板参数或任何模板参数是依赖类型或依赖于类型或值的表达式
[温度.dep.expr]/4
以下形式的表达式从不依赖类型(因为表达式的类型不能依赖):
sizeof unary-expression sizeof ( type-id )
[temp.dep.constexpr]/2
如果一元表达式或表达式是类型相关的或类型 ID 是相关的,则以下形式的表达式是值相关的:
sizeof unary-expression sizeof ( type-id )
我的解释是sizeof(T)
永远不能依赖于类型,意思sizeof(sizeof(T))
永远不能依赖于类型或依赖于值。
这是gcc中的错误吗?