template<typename T>
struct Test{};
template<typename Ret, typename...Args>
struct Test<Ret(*)(Args...)>{
using type = int;
};
void func(int){}
int main(){
Test<decltype(&func)>::type b;
}
如果类型p
是ret(*)(args...)
,而相应的参数类型a
是void(*)(int)
,则推演尝试从a
中推演模板参数,但是这种形式没有列在下面的列表中,该列表指定可以推演的类型的形式。
Temp.Deduct.Type#8
一个模板类型论元T,一个模板模板论元TT或一个模板非类型论元i,如果P和A具有下列形式之一,就可以推导出来:
这个列表指定了很多函数类型的指针,但是没有,只有诸如T(T)
这样的函数类型被包含,所以为什么这个列表中没有函数类型的指针,这样的类型应该是可以推导的。
指向函数的指针类型ret(*)(args.。。)
只不过是t*
,其中t
是ret(args.。。)
。
编辑:进一步的检查证明这是不够的。