Namespaces
Variants

const_cast conversion

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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:

1) Für zwei ähnliche Objektzeiger- oder Zeiger-auf-Datenelement-Typen 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)
2) Für zwei Objekttypen 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 T1 kann explizit zu einem Lvalue des Typs T2 mittels const_cast < T2 & > konvertiert werden.
  • Ein Glvalue des Typs T1 kann explizit zu einem Xvalue des Typs T2 mittels const_cast < T2 && > konvertiert werden.
  • Falls T1 ein Klassen- oder Arraytyp ist, kann ein Prvalue des Typs T1 explizit zu einem Xvalue des Typs T2 mittels 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) ;
  • ein xvalue, falls target-type eine Rvalue-Referenz auf Objekttyp ist;
(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

const_cast

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]

Siehe auch