【发布时间】:2021-08-03 09:11:11
【问题描述】:
template<class T>
T::type<int> f(){
}
根据 [temp.names#3.4]
如果一个
- [...]
- 在 using-declarator ([namespace.udecl])、declarator-id ([dcl.meaning]) 或 在除嵌套名称之外的纯类型上下文中的终端名称-说明符 ([temp.res])。
根据 [temp.res#general-4.3.1],T::type<int> 确实满足上述规则(强调我的),因为以下规则
如果一个限定或非限定名称是 type-only 上下文,如果它是
的终端名称
- [...]
- a 的 decl-specifier-seq 的 decl-specifier
- [...]
- 命名空间范围内的简单声明或函数定义,
T::type<int> 是位于命名空间范围内的模板函数f 的function-definition 的decl 说明符,因此终端名称type 被称为在类型中- 仅限上下文。
另外,根据 [temp.res#general-5]
一个合格的ID,它的终端名称是依赖的并且在一个仅类型的上下文中被认为是一个类型。
因此,T::type<int> 中的符号 < 由于 [temp.names#3.4] 被解释为模板参数列表的分隔符,而限定 ID T::type<int> 被认为表示到期类型到 [temp.res#general-5],这个例子应该是合法的。但是被Clang and GCC都拒绝了。
我想知道,在未来的实现编译的这个示例中,关键字typename 和template 是否都不需要?
【问题讨论】:
-
是不是还需要
template关键字来表示模板的开始?我认为您只能在内部模板类型中省略它,但我仍然希望保留它,因为它更易于阅读。 -
@Dai 我认为
template在这种情况下没有必要表明type是模板名称,因为 [temp.names#3.4]。 -
对,但
f是实际的函数模板。 -
@Dai 是的,
f被声明为函数模板,但是,[temp.res#general-4.3.1] 指的是语法,它没有不要说函数定义的 decl 说明符。 -
我怀疑Where and When Do I Put the
templateandtypenamekeywords? 至少可以说明其中的一部分。
标签: c++ language-lawyer