是否可以在函数模板的显式专业化中扣除多个模板参数?

时间:2019-06-26 12:09:23

标签: c++ language-lawyer template-specialization template-deduction function-templates

以下来自[temp.expl.spec.11]的引用:

  

template-id 中可以不指定尾随的 template-argument ,并命名 it < / strong>可以从函数参数类型推导出。

表示只能推导单个尾随模板参数。这将使以下示例代码不正确:

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进行编译。这些编译器是否应用了一些非标准的语言扩展,还是多个尾随参数支持推论?

如果后者是正确的,那么为什么句子的构成不如下?

  

跟踪 template-arguments 可以在 template-id 中未指定,而命名为他们 strong>可以从函数参数类型 s 推导出。

2 个答案:

答案 0 :(得分:3)

开头的“ a”是指 any 而不是 one

  可以在 template-id 中不指定

尾随的 template-argument 的名称,只要可以从函数参数类型中推导即可

这是我刚刚写的一句话:

  

在事先分析之前,将函数参数的类型 T 调整为 const T

这并不意味着仅调整了许多参数中的一个,而是调整了每个参数。如果有的话,因为也可能是没有参数。

从广义上讲,“ a”是指任何一件事情。

答案 1 :(得分:3)

引号并不表示只能保留单个参数。

  

只要可以从函数参数类型中推论出,后面的模板参数就可以在template-id中指定为显式功能模板特化,而不必指定。

表示如果可以推导a(any)参数,则可以将其保留。所以在

template<>
void f(int, double*) { }

我们不需要指定T1,因为它可以从int推导出来,我们也不需要指定T2,因为它可以从double*推导出来

如果标准只允许不指定单个参数,它将用类似的语言表达

  

如果可以从函数参数类型中推导出显式函数模板特化,则可以在template-id中保留未指定的单个尾随模板参数。