【发布时间】:2018-06-04 23:47:32
【问题描述】:
template <typename T>
void func(T&){
}
int main(){
void (*p)(int&) = func;//or &func
return 0;
}
我想知道为什么这段代码可以编译(使用 g++)。模板函数的参数似乎是从 p 的类型推导出来的?这是标准行为吗?
编辑: 我想出了一个可能的解释。该作业有签名:
void(*&)(int&)operator=(void(*)(int&));
所以func实际上是从operator=的输入参数类型推导出来的,而不是直接从p的类型推导出来的。对吗?
【问题讨论】:
-
请注意,在您发布的第一个 sn-p 中没有赋值运算符。变量初始化中出现的
=不会调用operator =。例如。C x = 4;将调用类C的构造函数,而不是C::operator=。
标签: c++ templates language-lawyer