从指向具有相同签名的函数的指针转换为函数指针,参数的附加限定除外

converting to function pointer from pointer to function with same signature, except additional qualification of parameter

本文关键字:指针 函数 参数 转换      更新时间:2023-10-16
void ( * pFunc_pcInt ) ( int const * ) = nullptr ; 
void ( * pFunc_pInt ) ( int * ) = reinterpret_cast< void ( * ) ( int * ) >( pFunc_pcInt ) ;

这种转换是否会导致未定义的行为。?

As来自标准(工作草案,重点矿井):

函数指针可以显式转换为不同类型的函数指针。[注意:通过指向与函数定义中使用的类型不同的函数类型([dcl.fct])的指针调用函数的效果是未定义的。—尾注][…]

当然,void(int const *)void(int *)是不同的类型。

类似的东西来自一个最著名的在线参考(强调矿):

指向函数的任何指针都可以转换为指向不同函数类型的指针通过指向不同函数类型的指针调用函数是未定义的,但将此类指针转换回指向原始函数类型的指示器会生成指向原始函数的指针。

在您的特定情况下,这并不重要,因为您将nullptr分配给函数指针。调用它在任何情况下都会导致错误
也就是说,如果您为pFunc_pcInt分配了一个有效的函数指针,那么通过转换后的指针pFunc_pInt调用它将是一个UB。