C++ 如何摆脱函数指针上的常量?

C++ 如何摆脱函数指针上的常量?,c++,casting,clang,C++,Casting,Clang,以下代码在GCC上编译clean,但在Clang上出错: typedef void (MyFuncPtr)(); void foo(const MyFuncPtr* ptr) { MyFuncPtr* myTestPtr = ptr; } 叮当声错误: error: cannot initialize a variable of type 'MyFuncPtr *' (aka 'void (*)()') with an lvalue of type 'const MyFuncPt

以下代码在GCC上编译clean,但在Clang上出错:

typedef void (MyFuncPtr)();
void foo(const MyFuncPtr* ptr)
{   
    MyFuncPtr* myTestPtr = ptr;
}
叮当声错误:

error: cannot initialize a variable of type 'MyFuncPtr *' (aka 'void (*)()') with an lvalue of type 'const MyFuncPtr *'
  (aka 'void (const *)()')
我尝试了以下解决方案,除了C样式转换之外,它们都会出错:

MyFuncPtr* myTestPtr = (MyFuncPtr*) ptr;
const_cast:

MyFuncPtr* myTestPtr = const_cast<MyFuncPtr*>(ptr);
重新浇筑:

MyFuncPtr* myTestPtr = reinterpret_cast<MyFuncPtr*>(ptr);
C型铸造:

MyFuncPtr* myTestPtr = (MyFuncPtr*) ptr;
成功

问题:
为什么const_cast不能在函数指针上工作?
使用C样式转换是唯一的解决方案吗?
为什么在GCC上不使用强制转换就可以工作

提前谢谢

编译器版本:
*G++版本4.6.3

*clang版本3.5.0.210790在代码中,
MyFuncPtr
是函数类型(不是函数指针类型)。代码尝试使用类型
const MyFuncPtr
,该类型将
const
应用于函数类型

但是,根据C++14[dcl.fct]/6中的注释,没有常量限定函数类型:

函数声明符中cv限定符seq的效果与在函数类型顶部添加cv限定符不同。在后一种情况下,cv限定符将被忽略。[注:具有cv限定符seq的函数类型不是cv限定类型;没有cv限定函数类型。-结束注]

本节主要讨论cv限定符seq,它是在成员函数之后出现的限定符。然而,顺便说一句,它似乎指定应用于函数类型的cv限定符通常被忽略

因此,您的代码应该与以下代码相同:

typedef void (MyFuncPtr)();
void foo(MyFuncPtr* ptr)
{   
    MyFuncPtr* myTestPtr = ptr;
}

这意味着clang被窃听以报告错误。

类型
constmyfuncptr*
几乎是胡说八道,而且毫无用处(就像几乎完全无用一样)。我能想到的每一个用法都没有一个实例与之关联。为什么你的程序中有这种类型?过于泛型的代码?请注意,
MyFuncPtr
实际上是一种函数类型,而不是函数指针类型(但这并不会使您的问题无效,实际上它使它更有趣)我在本例中使用的是c++11,这会影响你的答案吗?在clang版本3.7上,我开始得到以下与上面答案相匹配的警告:3::3:10:警告:“函数类型“MyFuncPtr”(又名“void()”)上的const限定符无效[-Wignored限定符]void foo(const MyFuncPtr*ptr)@Chadness3 OK,听起来好像clang已经在3.5中找到了bug,并在3.7中修复了它
typedef void (MyFuncPtr)();
void foo(MyFuncPtr* ptr)
{   
    MyFuncPtr* myTestPtr = ptr;
}