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

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 :

1) Para dos tipos de puntero a objeto o puntero a miembro de datos similares 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)
2) Para dos tipos de objeto 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 T1 puede convertirse explícitamente a un lvalue de tipo T2 usando const_cast < T2 & > .
  • Un glvalue de tipo T1 puede convertirse explícitamente a un xvalue de tipo T2 usando const_cast < T2 && > .
  • Si T1 es un tipo clase o array, un prvalue de tipo T1 puede convertirse explícitamente a un xvalue de tipo T2 usando 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) ;
  • un xvalue si target-type es una referencia a rvalue a tipo objeto;
(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

const_cast

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]

Véase también