在这种情况下是否不需要关键字“typename”和“template”?
template<class T>
T::type<int> f(){
}
根据 [temp.names#3.4]
如果 < 跟随的名称不是转换函数 id 和
- [...]
- 它是 using 声明符 ([namespace.udecl])、声明符 id ([dcl.meaning]) 或嵌套名称说明符([temp.资源])。
根据 [temp.res#general-4.3.1],T::type<int>由于以下规则,确实满足上述规则(强调我的)
一个合格的或不合格的名称被说成是在类型仅上下文如果它的终端名称
- [...]
- a 的 decl-specifier-seq 的 decl-specifier
- [...]
- 命名空间范围内的简单声明或函数定义,
T::type<int>是命名空间范围内模板函数的函数定义的声明说明符f,因此终端名称type被称为仅在类型上下文中。
另外,根据 [temp.res#general-5]
终端名称是相关的并且在仅类型上下文中的限定 ID 被认为是表示类型。
因此,由于 [temp.names#3.4] ,符号<inT::type<int>被解释为模板参数列表的分隔符,而T::type<int>由于 [temp.res#general-5],qualified-id被认为表示一种类型,例子应该是合法的。但是,它已被Clang 和 GCC拒绝。
我想知道,这个例子中的关键字typename和template不必要的都是由未来的实现编译的吗?