是否有规定指定对函数模板显式专用化中"return type"的限制?


template<class T>
void fun(T){}
template<>
int fun(int){return 0;}

考虑这个例子,它被所有实现拒绝。然而,我在现行标准中没有发现任何有说服力的条款,规定这种明确的专业化声明是不正确的。如果它存在,规则是什么?

此外,潜在的相关规则可能是【扣除温度下降#2】

如果对于所考虑的函数模板集,在考虑了偏序([temp.func.order](之后没有匹配或有多个匹配,则推导失败,并且在声明情况下,程序格式错误。

我认为";匹配";这里还不够清楚,因为";匹配";没有明确定义任何内容。

您的模板定义不匹配,因为void fun(T)在您的专业化中不是T fun(T),或者如果您有int fun(T)专门化int fun(int),则可能相反。

您只需更改为:

template<class T>
T fun(T){}
template<>
int fun(int){}

BTW:所有这些都会导致很多警告,因为你没有返回任何东西:-(

为什么不匹配:

template<class T>
void fun(T) {}

将T=int扩展为:

template<class T>
void fun(int) {}

但是:专业化(它不是一个,因为它不匹配(

template <>
int fun(int){return 0;}

具有一个永远无法从原始模板定义中推导出的返回类型,因此,它永远不是专门化,因为它总是具有返回类型void,而您的专门化具有int

您的报价是正确的。让我们还考虑以下文本:

在所有这些情况下,p是被认为是潜在匹配的函数模板的类型,a是。。。声明中的函数类型。。。按照[临时扣除类型]中的说明进行扣除。

这些p和A类型是什么?从[临时扣除类型]

试图找到模板参数值,在替换推导的值(称之为推导的A(后,使p与A兼容。

没有任何T值可以使A = int fun(int)P = void fun(T)兼容。

相关内容

  • 没有找到相关文章

最新更新