是否允许在函数模板的显式特化中推导多个模板参数?
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.
以下引自[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.