以下是[tem.ex.spec.11]的引文
可以在模板id中不指定尾随的函数template-argument (命名为显式函数模板专门化),前提是可以从函数参数类型推导出it。
指示只能推导出单个尾随模板参数。这将使下列示例代码不正确:
template <typename T1, typename T2>
void f(T1, T2*);
template<>
void f(int, double*) { }
int main()
{
auto d = 2.0;
f(1, &d);
}然而,代码与GCC和Clang一起编译得很好。这些编译器是应用了一些非标准的语言扩展,还是支持多个尾随参数的演绎?
如果后者是真的,为什么这个句子不按下面的形式形成呢?
可以在模板id中不指定template-arguments尾随,该模板命名为显式函数模板专门化,条件是可以从函数参数类型的中推导出。
发布于 2019-06-26 12:38:54
开头的"a“指的是任何非a。
任何尾随模板参数都可以在模板id中不指定,只要它可以从函数参数类型中推导出来,就可以命名一个显式函数模板专门化。
以下是我刚刚编造的一句话:
在先验分析之前,函数参数的类型T被调整为const T。
这并不意味着只调整了许多参数中的一个,而是每个参数;如果有的话,因为也可能没有参数。
"a“在更广义的意义上是指任何一件事物。
发布于 2019-06-26 12:40:23
引号并不表示只有一个参数可以停止。
后面的模板参数可以在模板id中不指定,只要它可以从函数参数类型中推导出来,就可以命名显式函数模板专门化。
这意味着,如果可以推导参数,则允许停止(任意)参数。所以在
template<>
void f(int, double*) { }我们不需要专门化T1,因为它可以从int中推导出来,我们也不需要指定T2,因为它可以从double*中推导出来。
如果标准只允许不指定单个参数,那么它将类似于
可以在模板id中不指定单个尾随模板参数,该模板命名为显式函数模板专门化,条件是它可以从函数参数类型中推导出来。
https://stackoverflow.com/questions/56772479
复制相似问题