const_cast vs static_cast
-
25-09-2019 - |
Frage
Um const
zu einem nicht-const-Objekt hinzufügen, das die bevorzugte Methode ist? const_cast<T>
oder static_cast<T>
. In einer aktuellen Frage, jemand erwähnt, dass sie es vorziehen, static_cast
zu verwenden, aber ich hätte gedacht, dass const_cast
die Absicht des Codes mehr klar machen würde. Also, was ist das Argument für static_cast
mit einer Variablen const machen?
Lösung
Verwenden Sie auch nicht. Initialisieren eines const Verweis, der auf das Objekt verweist:
T x;
const T& xref(x);
x.f(); // calls non-const overload
xref.f(); // calls const overload
Oder eine implicit_cast
Funktion Vorlage verwenden, wie der in-Boost zur Verfügung gestellt :
T x;
x.f(); // calls non-const overload
implicit_cast<const T&>(x).f(); // calls const overload
Vor die Wahl zwischen static_cast
und const_cast
ist static_cast
auf jeden Fall vorzuziehen: const_cast
nur verwendet werden sollte, wegzuwerfen Konstantheit, weil es die einzige Besetzung ist, die dies tun können, und Konstantheit Wegwerfen ist von Natur aus gefährlich . ein Objekt über einen Zeiger oder eine Referenz durch Gießen entfernt Konstantheit erhalten Modifizierung in undefinierten Verhalten führen kann.
Andere Tipps
Ich würde sagen, static_cast
vorzuziehen ist, da es nur Sie Besetzung von nicht-const
zu const
ermöglichen (was sicher ist), und nicht in der anderen Richtung (die nicht unbedingt sicher ist).
Dies ist ein guter Anwendungsfall für eine implicit_cast Funktion Vorlage.
Sie können Ihren eigenen Guss schreiben:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}