Warum kann nicht const_cast ich die Rückkehr des Umwandlungsoperator?
-
12-09-2019 - |
Frage
Ich habe einen Umwandlungsoperator bekam, die einen const Zeiger zurückgibt, und ich muss es const_cast. Doch das nicht funktioniert, zumindest unter MSVC8. Der folgende Code reproduziert mein Problem:
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 so? Es erscheint unlogisch. Dank!
Lösung
Um es Ihnen zu tun haben, funktioniert:
myPtr = const_cast<int*>(static_cast<const int*>(obj));
Wenn Sie direkt const_cast, der Compiler Look für den Cast-Operator in int *.
Andere Tipps
const_cast
kann nur die Konstantheit eines Typs ändern. Wenn Sie den impliziten Operator anrufen wollen, müssen Sie Sie eine static_cast
brauchen, und dann ein const_cast
. Während es ärgerlich macht es sicher, dass Sie explizit in dem, was Sie tun.
myPtr = const_cast<int*>(static_cast<const int*>(obj));
Sie können auch die alte Schule c-Casts Operator
myPtr = (int*)(const int*)obj;
Das ist aber sehr aus mehreren Gründen abgeraten:
- Es ist nicht grepable
- Sie können ganz einfach mehr tun, als Sie gedacht. Die meiste Zeit Sie wollen nicht zu verwirren mit
const_cast
Typ Operationen undstatic_cast
mit erzwingt dies. In der Tat wollen Sie nur sehr selten eineconst_cast
. Wenn Sie sich es regelmäßig zu tun haben Sie einige Design-Fehler.
Edit: Ich war etwas weg, ich regelte es jetzt. Es macht den c-Stil ein wenig hässlichen werfen
Sie können nur const_cast verwenden, um einen nicht konstanten Zeiger des gleichen Typs zu konvertieren (wegzuwerfen Konstantheit). Werfen zwischen nicht verwandten Arten Sie reinterpret_cast benötigen.
Denken Sie an const_cast<>
als Funktion template
template <typename Target, typename Source>
Target const_cast( Source src );
(das ist nicht, wie es umgesetzt, aber es hilft hier vorstellen, es war). Dann Source
als MyClass
abgeleitet, und es gibt nichts const_cast
tun kann, einen int zu erhalten * von einem MyClass.
Was Sie wollen, ist eine der folgenden:
const_cast<int*>( static_cast<const int*>(obj) /* invokes operator const int* */ );
// or
const_cast<int*>( obj.operator const int*() );
Wahrscheinlich wäre es klarer zu Ihrem Compiler, wenn Sie etwas tun, wie:
myPtr = const_cast<int*>(obj());
Ich habe noch nicht versucht, gedacht werden.
EDIT: Sollte die Bediener Erklärung nicht so etwas wie:
const int* operator () {