为何定义单个函数指针类型时星号可选,数组元素时则必须?
C++函数与函数指针typedef的语法差异问题
在C++中存在这样的语法差异:当用typedef定义类型后,单个函数参数允许互换使用“函数”和“函数指针”形式(typedef中的星号可选),但函数指针作为数组元素时要求严格,必须使用带星号的函数指针typedef。
示例代码
typedef void(Action)(); // typedef void(*Action)(); // 两种typedef均可正常编译 void doAction(Action f) { f(); } // 仅第二种带星号的typedef可正常工作 void doFirstAction(Action f_array[2]) { f_array[0](); }
Clang 15编译错误输出
error: 'f_array' declared as array of functions of type 'Action' (aka 'void ()') void doFirstAction(Action f_array[2]) { ^
问题分析与诉求
根据C++标准规定:
不得存在函数数组,但可以存在函数指针数组。
虽然标准明确禁止函数数组,但对于单个函数参数的场景,语法却更为灵活——即便用typedef定义的是“函数”类型,编译器也会自动将其调整为函数指针(因为函数无法直接作为参数传递,实际传递的都是指针)。
但这种规则不一致性并不合理,应该让同一种typedef要么同时适用于单个参数和数组元素场景,要么都不适用,保持语法规则的一致性。
内容的提问来源于stack exchange,提问作者MilesF
相关产品推荐
相关产品推荐

