首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否允许在函数模板的显式专门化中演绎多个模板参数?

是否允许在函数模板的显式专门化中演绎多个模板参数?
EN

Stack Overflow用户
提问于 2019-06-26 12:09:23
回答 2查看 129关注 0票数 2

以下是[tem.ex.spec.11]的引文

可以在模板id中不指定尾随的函数template-argument (命名为显式函数模板专门化),前提是可以从函数参数类型推导出it

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

代码语言:javascript
复制
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尾随,该模板命名为显式函数模板专门化,条件是可以从函数参数类型中推导出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-26 12:38:54

开头的"a“指的是任何非a。

任何尾随模板参数都可以在模板id中不指定,只要它可以从函数参数类型中推导出来,就可以命名一个显式函数模板专门化。

以下是我刚刚编造的一句话:

在先验分析之前,函数参数的类型T被调整为const T。

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

"a“在更广义的意义上是指任何一件事物。

票数 3
EN

Stack Overflow用户

发布于 2019-06-26 12:40:23

引号并不表示只有一个参数可以停止。

后面的模板参数可以在模板id中不指定,只要它可以从函数参数类型中推导出来,就可以命名显式函数模板专门化。

这意味着,如果可以推导参数,则允许停止(任意)参数。所以在

代码语言:javascript
复制
template<>
void f(int, double*) { }

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

如果标准只允许不指定单个参数,那么它将类似于

可以在模板id中不指定单个尾随模板参数,该模板命名为显式函数模板专门化,条件是它可以从函数参数类型中推导出来。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56772479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档