const_cast
conversion
Konvertiert zwischen Typen mit unterschiedlicher CV-Qualifikation.
Inhaltsverzeichnis |
Syntax
const_cast<
Zieltyp
>(
Ausdruck
)
|
|||||||||
Gibt einen Wert vom Typ target-type zurück.
Erklärung
Nur die folgenden Konvertierungen können mit const_cast durchgeführt werden:
T1
und
T2
kann ein prvalue vom Typ
T1
zu
T2
konvertiert werden, wenn
T1
und
T2
sich nur in der CV-Qualifikation unterscheiden (formal, wenn, unter Berücksichtigung der
Qualifikationszerlegungen
beider Typen, jedes
P1_i
gleich
P2_i
für alle
i
ist).
- Wenn expression ein Nullzeigerwert ist, ist das Ergebnis ebenfalls ein Nullzeigerwert.
- Wenn expression ein Null-Mitgliedszeigerwert ist, ist das Ergebnis ebenfalls ein Null-Mitgliedszeigerwert.
- Wenn expression auf ein Objekt zeigt, zeigt das Ergebnis auf dasselbe Objekt.
- Wenn expression über ein Objekt hinaus zeigt, zeigt das Ergebnis über dasselbe Objekt hinaus.
- Wenn expression auf ein Datenelement zeigt, zeigt das Ergebnis auf dasselbe Datenelement.
|
Selbst wenn expression ein prvalue ist, wird temporäre Materialisierung nicht durchgeführt. |
(seit C++17) |
T1
und
T2
, falls ein Zeiger auf
T1
explizit zum Typ "Zeiger auf
T2
" mittels
const_cast
<
T2
*
>
konvertiert werden kann, dann können folgende Konvertierungen ebenfalls durchgeführt werden:
-
Ein Lvalue des Typs
T1kann explizit zu einem Lvalue des TypsT2mittels const_cast < T2 & > konvertiert werden.
|
(seit C++11) |
|
Die Ergebnisreferenz referenziert das ursprüngliche Objekt. |
(bis C++17) |
|
Falls expression ein Glvalue ist, referenziert die Ergebnisreferenz das ursprüngliche Objekt. Andernfalls referenziert die Ergebnisreferenz das materialisierte Temporäre . |
(seit C++17) |
Wie bei allen Cast-Ausdrücken ist das Ergebnis:
- ein lvalue, wenn target-type ein lvalue reference type ist oder ein rvalue reference to function type (seit C++11) ;
|
(since C++11) |
- ein prvalue andernfalls.
Entfernen der Konstanz
Für zwei verschiedene Typen
T1
und
T2
entfernt eine Konvertierung von
T1
zu
T2
Constness
, 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
zu „cv2_0 P1_0 cv2_1 P1_1 ... cv2_n−1 P1_n−1 cv2_n U1“ konvertiert (gleiche cv-Komponenten, verschiedene P- und U-Komponenten).
Wenn eine Konvertierung von einem Prvalue des Typs
T1*
zum Typ
T2*
die Constness entfernt, dann entfernt auch die Konvertierung eines Ausdrucks des Typs
T1
zu einer Referenz auf
T2
die Constness.
Nur const_cast kann verwendet werden, um Constness wegzucasten.
"Casting away constness" impliziert "casting away volatility", da Qualifikationskonvertierungen ebenfalls Volatilität nicht entfernen können.
Hinweise
Zeiger auf Funktionen und Zeiger auf Elementfunktionen unterliegen nicht const_cast .
const_cast ermöglicht es, eine Referenz oder einen Zeiger auf einen nicht-konstanten Typ zu bilden, der tatsächlich auf ein const-Objekt verweist, oder eine Referenz oder einen Zeiger auf einen nicht-flüchtigen Typ, der tatsächlich auf ein volatile-Objekt verweist. Das Modifizieren eines const-Objekts über einen nicht-konstanten Zugriffspfad und das Referenzieren eines volatile-Objekts über einen nicht-flüchtigen glvalue führt zu undefiniertem Verhalten.
Schlüsselwörter
Beispiel
#include <iostream> struct type { int i; type(): i(3) {} void f(int v) const { // this->i = v; // Kompilierfehler: this ist ein Zeiger auf const const_cast<type*>(this)->i = v; // OK solange das type-Objekt nicht const ist } }; int main() { int i = 3; // i ist nicht als const deklariert const int& rci = i; const_cast<int&>(rci) = 4; // OK: modifiziert i std::cout << "i = " << i << '\n'; type t; // wenn dies const type t wäre, dann wäre t.f(4) undefiniertes Verhalten t.f(4); std::cout << "type::i = " << t.i << '\n'; const int j = 3; // j ist als const deklariert [[maybe_unused]] int* pj = const_cast<int*>(&j); // *pj = 4; // undefiniertes Verhalten [[maybe_unused]] void (type::* pmf)(int) const = &type::f; // Zeiger auf Member-Funktion // const_cast<void(type::*)(int)>(pmf); // Kompilierfehler: const_cast funktioniert // nicht bei Funktionszeigern }
Ausgabe:
i = 4 type::i = 4
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 1965 | C++11 | const_cast konnte Rvalue-Referenzen auf Array-PRvalues nicht binden | Binden solcher Referenzen erlaubt |
| CWG 2879 | C++17 | Pointer-Pvalue-Operanden wurden materialisiert | Sie werden nicht materialisiert |
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]