Namensräume
Varianten
Aktionen

const_cast-Konvertierung

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

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

1) Für zwei ähnliche Objektzeigertypen oder Zeigertypen auf Member-Daten 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)
2) Für zwei Objekttypen 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 T1 kann mit const_cast<T2&> explizit in einen lvalue vom Typ T2 konvertiert werden.
  • Ein glvalue vom Typ T1 kann mit const_cast<T2&&> explizit in ein xvalue vom Typ T2 konvertiert werden.
  • Wenn T1 ein Klassen- oder Arraytyp ist, kann ein Prvalue vom Typ T1 mit const_cast<T2&&> explizit in ein xvalue vom Typ T2 konvertiert 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);
  • ein xvalue, wenn Zieltyp ein rvalue-Referenztyp auf ein Objekt ist;
(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

const_cast

[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]

[bearbeiten] Siehe auch