【发布时间】:2022-01-23 15:18:51
【问题描述】:
template<class T>
void fun(T){}
template<>
int fun(int){return 0;}
考虑这个例子,所有实现都是rejected。但是,我在当前标准中没有找到任何有说服力的条款来指定这个明确的专业化声明是格式错误的。如果存在,规则是什么?
此外,潜在的相关规则可能是 [temp.deduct.decl#2]
如果对于这样考虑的一组函数模板,在考虑了部分排序([temp.func.order])之后没有匹配或多个匹配,则推导失败并且,在声明的情况下,程序是非良构的。
我认为“匹配”的含义在这里不够清楚,因为“匹配”没有明确定义任何东西。
【问题讨论】:
-
如果允许,
static_cast<void(*)(int)>(&fun)会做什么?编译器会先成功推导出T = int,然后找到特化,然后将特化函数的类型与强制转换中的类型进行比较? -
@HolyBlackCat:好问题,但这是另一个问题。 (具体参见 13.10.3.3 以函数模板的地址推导模板参数)。
-
@HolyBlackCat 本期的主题是找出能够有说服力地证明这个例子是错误的相关规定。如果该条款不存在或含糊不清,我们可以认为这是一个缺陷。
标签: c++ templates language-lawyer explicit-specialization