传递隐式函数指针 在一些C++ 98代码中(意思是不,使用 STD::函数< /C>不是选项),我发现以下构造: class someClass { public: typedef void callback(); void setCallback(callback c) { mCallback = c; } void callCallback() { if (mCallback) mCallback(); } private: callback *mCallback; };

传递隐式函数指针 在一些C++ 98代码中(意思是不,使用 STD::函数< /C>不是选项),我发现以下构造: class someClass { public: typedef void callback(); void setCallback(callback c) { mCallback = c; } void callCallback() { if (mCallback) mCallback(); } private: callback *mCallback; };,c++,c++98,C++,C++98,这让我很困惑。我习惯于将回调函数作为函数指针传递,因此我希望setCallback将(*callback)(作为参数 但是,上面的代码似乎有效,编译时没有任何(相关)警告 有人能告诉我这里发生了什么事吗?回调函数是否作为函数指针隐式传递?用它代替函数指针是个好主意吗 我唯一能发现的是,这种构造导致了“参数声明子句”的歧义(C++98)。这是唯一的缺点吗?有什么好处吗?类似于数组,函数类型的参数声明,实际上是指向该类型的指针。在参数声明中,函数类型被调整为指向函数类型的指针。当函数类型用作函数参数

这让我很困惑。我习惯于将回调函数作为函数指针传递,因此我希望
setCallback
(*callback)(
作为参数

但是,上面的代码似乎有效,编译时没有任何(相关)警告

有人能告诉我这里发生了什么事吗?回调函数是否作为函数指针隐式传递?用它代替函数指针是个好主意吗


我唯一能发现的是,这种构造导致了“参数声明子句”的歧义(C++98)。这是唯一的缺点吗?有什么好处吗?

类似于数组,函数类型的参数声明,实际上是指向该类型的指针。

在参数声明中,函数类型被调整为指向函数类型的指针。当函数类型用作函数参数类型时,它被调整为指向函数类型的指针,因此
setCallback
同样可以被声明为
void setCallback(callback*c)
。(函数类型和数组类型在这方面和相关方面非常相似。)规范中是否有对此的引用?据我所知,这不存在于C中,它是C++中的(83.5/5),在C11中是6 7.6/3/8。在确定每个参数的类型之后,任何类型的“T”数组或“函数返回T”的参数都被调整为“指向T”的指针或“函数返回T的指针”。谢谢