const_cast
conversion
Convierte entre tipos con diferente calificación cv.
Contenidos |
Sintaxis
const_cast<
tipo-destino
>(
expresión
)
|
|||||||||
Devuelve un valor de tipo target-type .
Explicación
Solo las siguientes conversiones se pueden realizar con const_cast :
T1
y
T2
, un prvalue de tipo
T1
puede convertirse a
T2
si
T1
y
T2
difieren solo en calificación-cv (formalmente, si, considerando las
descomposiciones-de-calificación
de ambos tipos, cada
P1_i
es igual a
P2_i
para todo
i
).
- Si expresión es un valor de puntero nulo, el resultado también es un valor de puntero nulo.
- Si expresión es un valor de puntero a miembro nulo, el resultado también es un valor de puntero a miembro nulo.
- Si expresión apunta a un objeto, el resultado apunta al mismo objeto.
- Si expresión apunta más allá de un objeto, el resultado apunta más allá del mismo objeto.
- Si expresión apunta a un miembro de datos, el resultado apunta al mismo miembro de datos.
|
Incluso si expresión es un prvalue, materialización temporal no se realiza. |
(desde C++17) |
T1
y
T2
, si un puntero a
T1
puede convertirse explícitamente al tipo "puntero a
T2
" usando
const_cast
<
T2
*
>
, entonces también se pueden realizar las siguientes conversiones:
-
Un lvalue de tipo
T1puede convertirse explícitamente a un lvalue de tipoT2usando const_cast < T2 & > .
|
(desde C++11) |
|
La referencia resultante se refiere al objeto original. |
(hasta C++17) |
|
Si expresión es un glvalue, la referencia resultante se refiere al objeto original. De lo contrario, la referencia resultante se refiere al temporal materializado . |
(desde C++17) |
Como con todas las expresiones de conversión, el resultado es:
- un lvalue si target-type es un tipo de referencia lvalue o una referencia rvalue a tipo función (desde C++11) ;
|
(since C++11) |
- un prvalue en caso contrario.
Eliminación de constancia
Para dos tipos diferentes
T1
y
T2
, una conversión de
T1
a
T2
elimina constancia
si existe una
descomposición de calificación
de
T2
de la forma “cv2_0 P2_0 cv2_1 P2_1 ... cv2_n−1 P2_n−1 cv2_n U2”, y no hay
conversiones de calificación
que conviertan
T1
a “cv2_0 P1_0 cv2_1 P1_1 ... cv2_n−1 P1_n−1 cv2_n U1” (mismos componentes cv, diferentes componentes P y componentes U).
Si una conversión de un prvalue de tipo
T1*
al tipo
T2*
elimina constness, convertir de una expresión de tipo
T1
a una referencia a
T2
también eliminará constness.
Solo const_cast puede utilizarse para eliminar la constancia.
"Descartar la constancia" implica "descartar la volatilidad", ya que las conversiones de calificación tampoco pueden descartar la volatilidad.
Notas
Los punteros a funciones y los punteros a funciones miembro no están sujetos a const_cast .
const_cast permite formar una referencia o puntero a un tipo no constante que en realidad se refiere a un objeto constante o una referencia o puntero a un tipo no volátil que en realidad se refiere a un objeto volátil . Modificar un objeto constante a través de una ruta de acceso no constante y referirse a un objeto volátil a través de un glvalue no volátil resulta en comportamiento indefinido.
Palabras clave
Ejemplo
#include <iostream> struct type { int i; type(): i(3) {} void f(int v) const { // this->i = v; // error de compilación: this es un puntero a const const_cast<type*>(this)->i = v; // OK mientras el objeto type no sea const } }; int main() { int i = 3; // i no está declarado como const const int& rci = i; const_cast<int&>(rci) = 4; // OK: modifica i std::cout << "i = " << i << '\n'; type t; // si esto fuera const type t, entonces t.f(4) sería comportamiento indefinido t.f(4); std::cout << "type::i = " << t.i << '\n'; const int j = 3; // j está declarado como const [[maybe_unused]] int* pj = const_cast<int*>(&j); // *pj = 4; // comportamiento indefinido [[maybe_unused]] void (type::* pmf)(int) const = &type::f; // puntero a función miembro // const_cast<void(type::*)(int)>(pmf); // error de compilación: const_cast no // funciona con punteros a función }
Salida:
i = 4 type::i = 4
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| CWG 1965 | C++11 | const_cast no podía enlazar referencias rvalue a prvalues de array | se permite enlazar dichas referencias |
| CWG 2879 | C++17 | los operandos pvalue de puntero eran materializados | no se materializan |
Referencias
- Estándar C++23 (ISO/IEC 14882:2024):
-
- 7.6.1.11 Const cast [expr.const.cast]
- Estándar C++20 (ISO/IEC 14882:2020):
-
- 7.6.1.10 Const cast [expr.const.cast]
- Estándar C++17 (ISO/IEC 14882:2017):
-
- 8.2.11 Conversión constante [expr.const.cast]
- Estándar C++14 (ISO/IEC 14882:2014):
-
- 5.2.11 Const cast [expr.const.cast]
- Estándar C++11 (ISO/IEC 14882:2011):
-
- 5.2.11 Const cast [expr.const.cast]
- Estándar C++98 (ISO/IEC 14882:1998):
-
- 5.2.11 Const cast [expr.const.cast]
- Estándar C++03 (ISO/IEC 14882:2003):
-
- 5.2.11 Const cast [expr.const.cast]