是否允许在函数模板的显式特化中推导多个模板参数?

Is deduction of multiple template arguments in an explicit specialization of a function template allowed?

以下引自[temp.expl.spec.11]

A trailing template-argument can be left unspecified in the template-id naming an explicit function template specialization provided it can be deduced from the function argument type.

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

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

如果是后者,为什么句子不是这样构成的?

Trailing template-arguments can be left unspecified in the template-id naming an explicit function template specialization provided they can be deduced from the function argument types.

开头的"a"指的是any不是one.

A[ny] trailing template-argument can be left unspecified in the template-id naming an explicit function template specialization provided it can be deduced from the function argument type.

这是我刚刚编造的一句话:

A function parameter's type T is adjusted to const T before prior analysis.

这并不是说只调整了众多参数中的一个,而是每一个参数都被调整了;如果有的话,因为也有可能是没有参数。

"a" 泛指任何事物。

引号并不表示只能省略一个参数。

A trailing template-argument can be left unspecified in the template-id naming an explicit function template specialization provided it can be deduced from the function argument type.

表示一个(任意)参数如果可以推导出来,则允许省略。所以在

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

我们不需要指定T1,因为它可以从int推导出来,我们不需要指定T2,因为它可以从[=14推导出来] =].

如果标准只允许不指定单个参数,它会这样写

A single trailing template-argument can be left unspecified in the template-id naming an explicit function template specialization provided it can be deduced from the function argument type.