有一个这样的结构:
template<class Func >
class Call
{
Func* funcPtr;
public:
Call(Func* func) :funcPtr{ func }
{
std::cout << typeid(Func).name() << std::endl;
};
如果我创建这样的对象,那么一切正常:
Call<decltype(Beep)> a(Beep);
如果我将构造函数中的类型更改为Func,Func*一切都很好。
这里的问题已经是为什么第二个选项有效,因为它将Func是函数类型而不是函数指针。我们如何创建函数类型变量?...
函数参数被自动替换:如果参数类型是函数,那么它被替换为指向该函数的指针。一个类似的规则更为人所知,根据该规则,数组被函数参数中的指针替换。
同样的事情发生在(非类型)模板参数的类型中。
[dcl.fct]/5