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?

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top