Le code suivant compile propre sur GCC, mais obtient une erreur sur Clang:Comment éliminer la constité sur un pointeur de fonction?
typedef void (MyFuncPtr)();
void foo(const MyFuncPtr* ptr)
{
MyFuncPtr* myTestPtr = ptr;
}
erreur Clang:
error: cannot initialize a variable of type 'MyFuncPtr *' (aka 'void (*)()') with an lvalue of type 'const MyFuncPtr *'
(aka 'void (const *)()')
J'ai essayé les solutions suivantes et ils ont tous obtenir des erreurs, sauf pour le style C exprimés:
const_cast:
MyFuncPtr* myTestPtr = const_cast<MyFuncPtr*>(ptr);
Erreur:
error: const_cast to 'MyFuncPtr *' (aka 'void (*)()'), which is not a reference, pointer-to-object, or pointer-to-data-member
reintepret_cast:
MyFuncPtr* myTestPtr = reinterpret_cast<MyFuncPtr*>(ptr);
Erreur:
error: reinterpret_cast from 'const MyFuncPtr *' (aka 'void (const *)()') to 'MyFuncPtr *' (aka 'void (*)()') casts away
qualifiers
fonte style C:
MyFuncPtr* myTestPtr = (MyFuncPtr*) ptr;
succès!
Questions:
Pourquoi const_cast ne fonctionne-t-il pas sur les pointeurs de fonction?
L'utilisation d'un cast de style C est-elle la seule solution?
Pourquoi cela fonctionne-t-il sur GCC sans casting?
Merci d'avance!
VERSIONS Compilateur:
* G ++ version 4.6.3
* version clang 3.5.0.210790
Le type 'const MyFuncPtr *' est presque un non-sens et tout aussi inutile (comme presque totalement inutile). Et chaque utilisation à laquelle je peux penser n'a pas de * instance * associée. Pourquoi avez-vous ce type dans votre programme? Code trop générique? – Yakk
note que 'MyFuncPtr' est en fait un type de fonction, pas un type de pointeur de fonction (Mais cela n'invalide pas votre question, en fait cela le rend plus intéressant) –