const_cast
conversion
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 :
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) |
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
T1peut être explicitement convertie en une lvalue de typeT2en 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) ;
|
(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
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]