const_cast-Konvertierung
Konvertiert zwischen Typen mit unterschiedlicher cv-Qualifikation.
Inhalt |
[bearbeiten] Syntax
const_cast< zieltyp >( ausdruck ) |
|||||||||
Gibt einen Wert vom Typ Zieltyp zurück.
[bearbeiten] Erklärung
Nur die folgenden Konvertierungen können mit const_cast durchgeführt werden
T1 und T2 kann ein Prvalue vom Typ T1 nach T2 konvertiert werden, wenn T1 und T2 sich nur in der cv-Qualifikation unterscheiden (formal, wenn bei Betrachtung der Qualifikationszerlegungen beider Typen jedes P1_i gleich P2_i ist für alle i).- Wenn ausdruck ein Nullzeigerwert ist, ist das Ergebnis ebenfalls ein Nullzeigerwert.
- Wenn ausdruck ein Null-Memberzeigerwert ist, ist das Ergebnis ebenfalls ein Null-Memberzeigerwert.
- Wenn ausdruck auf ein Objekt zeigt, zeigt das Ergebnis auf dasselbe Objekt.
- Wenn ausdruck über ein Objekt hinaus zeigt, zeigt das Ergebnis über dasselbe Objekt hinaus.
- Wenn ausdruck auf ein Member-Datum zeigt, zeigt das Ergebnis auf dasselbe Member-Datum.
|
Auch wenn ausdruck ein Prvalue ist, wird keine temporäre Materialisierung durchgeführt. |
(seit C++17) |
T1 und T2, wenn ein Zeiger auf T1 mit const_cast<T2*> explizit in den Typ "Zeiger auf T2" konvertiert werden kann, dann können auch folgende Konvertierungen vorgenommen werden:- Ein lvalue vom Typ
T1kann mit const_cast<T2&> explizit in einen lvalue vom TypT2konvertiert werden.
|
(seit C++11) |
|
Die Ergebnisreferenz bezieht sich auf das ursprüngliche Objekt. |
(bis C++17) |
|
Wenn ausdruck ein glvalue ist, bezieht sich die Ergebnisreferenz auf das ursprüngliche Objekt. Andernfalls bezieht sich die Ergebnisreferenz auf das materialisierte temporäre Objekt. |
(seit C++17) |
Wie bei allen Cast-Ausdrücken ist das Ergebnis
- ein lvalue, wenn Zieltyp ein lvalue-Referenztyp ist oder ein rvalue-Referenztyp auf eine Funktion(seit C++11);
|
(seit C++11) |
- sonst ein prvalue.
[bearbeiten] Constness wegwerfen
Für zwei verschiedene Typen T1 und T2 wirft eine Konvertierung von T1 nach T2 Constness weg, wenn es eine Qualifikationszerlegung von T2 der Form “cv2_0 P2_0 cv2_1 P2_1 ... cv2_n−1 P2_n−1 cv2_n U2” gibt und keine Qualifikationskonvertierung existiert, die T1 in “cv2_0 P1_0 cv2_1 P1_1 ... cv2_n−1 P1_n−1 cv2_n U1” (gleiche cv-Komponenten, unterschiedliche P-Komponenten und U-Komponenten) konvertiert.
Wenn ein Cast von einem Prvalue vom Typ T1* zum Typ T2* Constness wegwirft, wirft auch ein Cast von einem Ausdruck vom Typ T1 zu einer Referenz auf T2 Constness weg.
Nur const_cast darf verwendet werden, um Constness wegzuwerfen.
"Constness wegwerfen" impliziert "volatility wegwerfen", da Qualifikationskonvertierungen auch keine volatility wegwerfen können.
[bearbeiten] Hinweise
Funktionszeiger und Zeiger auf Memberfunktionen unterliegen nicht const_cast.
const_cast ermöglicht die Bildung einer Referenz oder eines Zeigers auf einen Nicht-Const-Typ, der tatsächlich auf ein const-Objekt verweist, oder einer Referenz oder eines Zeigers auf einen Nicht-volatile-Typ, der tatsächlich auf ein const-Objekt verweist. Das Modifizieren eines const-Objekts über einen Nicht-Const-Zugriffspfad und das Verweisen auf ein volatile-Objekt über einen Nicht-volatile glvalue führt zu undefiniertem Verhalten.
[bearbeiten] Schlüsselwörter
[bearbeiten] Beispiel
#include <iostream> struct type { int i; type(): i(3) {} void f(int v) const { // this->i = v; // compile error: this is a pointer to const const_cast<type*>(this)->i = v; // OK as long as the type object isn't const } }; int main() { int i = 3; // i is not declared const const int& rci = i; const_cast<int&>(rci) = 4; // OK: modifies i std::cout << "i = " << i << '\n'; type t; // if this was const type t, then t.f(4) would be undefined behavior t.f(4); std::cout << "type::i = " << t.i << '\n'; const int j = 3; // j is declared const [[maybe_unused]] int* pj = const_cast<int*>(&j); // *pj = 4; // undefined behavior [[maybe_unused]] void (type::* pmf)(int) const = &type::f; // pointer to member function // const_cast<void(type::*)(int)>(pmf); // compile error: const_cast does // not work on function pointers }
Ausgabe
i = 4 type::i = 4
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 1965 | C++11 | const_cast konnte rvalue-Referenzen an Array-Prvalues nicht binden | erlaubt, solche Referenzen zu binden |
| CWG 2879 | C++17 | pvalue-Operanden von Zeigern wurden materialisiert | sie werden nicht materialisiert |
[bearbeiten] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 7.6.1.11 Const cast [expr.const.cast]
- C++20 Standard (ISO/IEC 14882:2020)
- 7.6.1.10 Const cast [expr.const.cast]
- C++17 Standard (ISO/IEC 14882:2017)
- 8.2.11 Const cast [expr.const.cast]
- C++14 Standard (ISO/IEC 14882:2014)
- 5.2.11 Const cast [expr.const.cast]
- C++11 Standard (ISO/IEC 14882:2011)
- 5.2.11 Const cast [expr.const.cast]
- C++98 Standard (ISO/IEC 14882:1998)
- 5.2.11 Const cast [expr.const.cast]
- C++03-Standard (ISO/IEC 14882:2003)
- 5.2.11 Const cast [expr.const.cast]