J'ai un opérateur de conversion qui retourne un pointeur const, et j'ai besoin de const_cast. Cependant, cela ne fonctionne pas, au moins sous MSVC8. Le code suivant reproduit mon problème:Pourquoi ne puis-je pas const_cast le retour de l'opérateur de conversion?
class MyClass {
public:
operator const int*() {
return 0;
}
};
int main() {
MyClass obj;
int* myPtr;
// compiles
const int* myConstPtr = obj;
// compiles
myPtr = const_cast<int*>(myConstPtr);
// doesn't compile (C2440: 'const_cast' : cannot convert from 'MyClass' to 'int *')
myPtr = const_cast<int*>(obj);
}
Pourquoi est-ce? Cela semble contre-intuitif. Merci!
Etes-vous vraiment en train d'essayer de retourner un pointeur nul avec 'const int *'?C'est aussi une mauvaise habitude de pouvoir transformer une classe en un pointeur vers une primitive. (Par exemple, 'std :: string' ne peut pas être converti en' const char * 'mais fournit une méthode' .c_str() 'qui retourne un pointeur sur ses données .C'est beaucoup plus sûr car alors le programmeur doit être très conscient de ce qu'il fait.) –
@Seth: Merci. Ce n'est pas mon vrai code; c'est juste quelque chose que j'ai écrit pour reproduire l'erreur que je reçois! Rassurez-vous, je ne renvoie pas de pointeurs null dans le but :-) Dans mon cas, la classe est un wrapper fin autour d'un tableau d'octets, et j'aimerais que ses clients l'utilisent comme s'il s'agissait d'un seul. –
Si vous avez l'intention que les utilisateurs puissent manipuler le bytearray directement, alors vous devriez leur donner un opérateur non-const int *() '. En général, donner seulement la version const implique que vous autorisez les lectures mais pas les modifications. Forcer les utilisateurs à faire un 'const_cast' est une erreur dans mon livre. –