low*_*fer 32 c++ templates language-lawyer
template <typename T>
void func(T&){
}
int main(){
void (*p)(int&) = func;//or &func
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这个代码编译(使用g ++).似乎模板函数的论证是从p的类型推导出来的?这是标准行为吗?
编辑:我想出了一个可能的解释.签名有签名:
void(*&)(int&)operator=(void(*)(int&));
Run Code Online (Sandbox Code Playgroud)
所以func实际上是从operator =的输入参数类型推导出来的,而不是直接从p的类型推导出来的.那是对的吗?
Sto*_*ica 29
这是标准行为吗?
是的.当您获取函数模板的地址时(例如,在分配或初始化函数指针时执行),也会发生模板参数推导.它在[temp.deduct.funcaddr]/1中明确允许:
在获取重载函数的地址时,可以从指定的类型推导出模板参数.函数模板的函数类型和指定的类型用作P和A的类型,并且如[temp.deduct.type]中所述完成演绎.
函数指针类型提供参数(A在上一段中).
所以func实际上是从operator =的输入参数类型推导出来的,而不是直接从p的类型推导出来的.那是对的吗?
并不是的.首先,它不是赋值,它是你正在进行的初始化.即使它使用了重载operator=函数,你也需要推导来初始化赋值运算符的参数,这会使你回到原点.