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

Convertit entre des types avec différentes qualifications cv.

Table des matières

Syntaxe

const_cast< type-cible >( expression )

Retourne une valeur de type target-type .

Explication

Seules les conversions suivantes peuvent être effectuées avec const_cast :

1) Pour deux types de pointeurs d'objet ou de pointeurs vers membre de données similaires T1 et T2 , une prvalue de type T1 peut être convertie en T2 si T1 et T2 ne diffèrent que par leur qualification cv (formellement, si, en considérant les décompositions de qualification des deux types, chaque P1_i est identique à P2_i pour tout i ).
  • Si expression est une valeur de pointeur nul, le résultat est également une valeur de pointeur nul.
  • Si expression est une valeur de pointeur de membre nul, le résultat est également une valeur de pointeur de membre nul.
  • Si expression pointe vers un objet, le résultat pointe vers le même objet.
  • Si expression pointe au-delà d'un objet, le résultat pointe au-delà du même objet.
  • Si expression pointe vers un membre de données, le résultat pointe vers le même membre de données.

Même si expression est une prvalue, la matérialisation temporaire n'est pas effectuée.

(depuis C++17)
2) Pour deux types d'objets T1 et T2 , si un pointeur vers T1 peut être explicitement converti vers le type « pointeur vers T2 » en utilisant const_cast < T2 * > , alors les conversions suivantes peuvent également être effectuées :
  • Une lvalue de type T1 peut être explicitement convertie en une lvalue de type T2 en utilisant const_cast < T2 & > .
  • Une glvalue de type T1 peut être explicitement convertie en une xvalue de type T2 en utilisant const_cast < T2 && > .
  • Si T1 est un type classe ou tableau, une prvalue de type T1 peut être explicitement convertie en une xvalue de type T2 en utilisant const_cast < T2 && > .
(depuis C++11)

La référence résultante fait référence à l'objet original.

(jusqu'à C++17)

Si l'expression est une glvalue, la référence résultante fait référence à l'objet original. Sinon, la référence résultante fait référence au temporaire matérialisé .

(depuis C++17)

Comme pour toutes les expressions de cast, le résultat est :

  • un lvalue si target-type est un type référence lvalue ou une référence rvalue vers un type fonction (depuis C++11) ;
  • une xvalue si target-type est une référence à rvalue vers un type objet ;
(depuis C++11)
  • un prvalue sinon.

Suppression de la constance

Pour deux types différents T1 et T2 , une conversion de T1 vers T2 supprime la constance s'il existe une décomposition de qualification de T2 de la forme « cv2_0 P2_0 cv2_1 P2_1 ... cv2_n−1 P2_n−1 cv2_n U2 », et qu'aucune conversion de qualification ne convertit T1 en « cv2_0 P1_0 cv2_1 P1_1 ... cv2_n−1 P1_n−1 cv2_n U1 » (mêmes composantes cv, différentes composantes P et U).

Si un transtypage d'une prvalue de type T1* vers le type T2* supprime la constance, le transtypage d'une expression de type T1 vers une référence vers T2 supprimera également la constance.

Seul const_cast peut être utilisé pour supprimer la constance.

« Supprimer la constance » implique « supprimer la volatilité », car les conversions de qualification ne peuvent pas non plus supprimer la volatilité.

Notes

Les pointeurs vers des fonctions et les pointeurs vers des fonctions membres ne sont pas soumis à const_cast .

const_cast permet de former une référence ou un pointeur vers un type non-const qui se réfère en réalité à un objet const ou une référence ou un pointeur vers un type non-volatile qui se réfère en réalité à un objet volatile . Modifier un objet const via un chemin d'accès non-const et se référer à un objet volatile via une glvalue non-volatile entraîne un comportement indéfini.

Mots-clés

const_cast

Exemple

#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
}

Sortie :

i = 4
type::i = 4

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
CWG 1965 C++11 const_cast ne pouvait pas lier les références rvalue aux prvalues de tableau autorisé à lier ces références
CWG 2879 C++17 les opérandes pvalue de pointeur étaient matérialisés ils ne sont pas matérialisés

Références

  • Norme C++23 (ISO/IEC 14882:2024) :
  • 7.6.1.11 Conversion const [expr.const.cast]
  • Norme C++20 (ISO/IEC 14882:2020) :
  • 7.6.1.10 Const cast [expr.const.cast]
  • Norme C++17 (ISO/IEC 14882:2017) :
  • 8.2.11 Const cast [expr.const.cast]
  • Norme C++14 (ISO/CEI 14882:2014) :
  • 5.2.11 Const cast [expr.const.cast]
  • Norme C++11 (ISO/IEC 14882:2011) :
  • 5.2.11 Const cast [expr.const.cast]
  • Norme C++98 (ISO/CEI 14882:1998) :
  • 5.2.11 Const cast [expr.const.cast]
  • Norme C++03 (ISO/CEI 14882:2003) :
  • 5.2.11 Const cast [expr.const.cast]

Voir aussi