我非常清楚为什么需要使用typename
依赖类型,因为当它看到类似的东西时,编译器可能无法消除类型和变量声明之间的歧义T::type
,请参阅此答案以获得一个很好的解释.TL; DR:在类似的表达式中T::type * x;
,编译器不能"知道" T::type
是某个类型,还是在某个特定的特化中声明的变量T
.
但是,在类似的东西
using type = T::type;
没有任何暧昧.IMO T::type
应该始终被解析为一个类型,因为它是using
语句的RHS的一部分.但是,我们仍然需要在typename
这里使用(至少根据gcc和clang),
using type = typename T::type;
Live on Coliru, gcc Live on Coliru, clang
Visual C++ 似乎接受了没有a 的代码typename
,但是我对编译器完全符合标准没有太多信心(实际上,它有许多非标准扩展,例如将rvalues绑定到非const引用).
问:有什么理由说这不是typename
C++ 11及更高版本规则的例外吗?