Ich habe einen Konvertierungsoperator, der einen const Zeiger zurückgibt, und ich muss ihn const_cast. Das funktioniert jedoch zumindest unter MSVC8 nicht. Der folgende Code gibt mein Problem wieder:Warum kann ich die Rückgabe des Konvertierungsoperators nicht const_cast?
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);
}
Warum ist das? Es scheint kontraintuitiv zu sein. Vielen Dank!
Versuchen Sie wirklich, einen Nullzeiger mit 'const int *' zurückzugeben?Es ist in der Regel auch eine schlechte Übung, eine Klasse stillschweigend in einen Zeiger auf ein Primitiv umwandeln zu können. (Zum Beispiel kann 'std :: string' nicht in' const char * 'umgewandelt werden, sondern stellt stattdessen eine Methode' .c_str() 'zur Verfügung, die einen Zeiger auf ihre Daten zurückgibt. Dies ist viel sicherer, weil der Programmierer sehr stark sein muss bewusst, was er tut.) –
@Seth: Danke. Das ist nicht mein wirklicher Code; es ist nur etwas, was ich geschrieben habe, um den Fehler zu reproduzieren, den ich bekomme! Seien Sie versichert, ich gebe keine Null-Zeiger absichtlich zurück :-) In meinem Fall ist die Klasse ein dünner Wrapper um ein Byte-Array, und ich möchte, dass ihre Clients es verwenden, als wäre es eins. –
Wenn Sie beabsichtigen, dass Benutzer das Bytearray direkt bearbeiten können, sollten Sie ihnen einen nichtkonstanten Operator int *() 'geben. Im Allgemeinen geben Sie nur die const-Version impliziert, dass Sie Lesevorgänge zulassen, aber nicht ändern. Die Benutzer zu zwingen, eine 'const_cast' zu machen, ist ein Fehler in meinem Buch. –