const int i0 = 5;
//int i1 = const_cast<int>(i0); // compilation error
int i2 = (int)i0; // okay
int i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
const int i5 = (const int)i3; // okay
La compilación errores se deben a que no desechan const distancia/agregar const. En cambio, copie i0. Para esta operación, no se requiere un molde en absoluto:
int i1 = i0;
const int i4 = i3;
El tipo que lances en realidad debería ser un puntero o referencia. De lo contrario, usar const_cast no tiene sentido ya que podrías copiarlo directamente. Para los punteros, por ejemplo, puede descartar el const, porque desreferenciar el puntero arrojará otro tipo para un const T*
(produce const T
) que para un T*
(produce T
). Para las referencias, lo mismo es cierto: T&
accederá al objeto usando otro este tipo de puntero que usando const T&
. Ahora lo que realmente quería archivar:
const int i0 = 5;
//int & i1 = const_cast<int&>(i0); // okay (but dangerous)
int & i2 = (int&)i0; // okay (but dangerous)
int i3 = 5;
//const int&i4 = const_cast<const int&>(i3); // ok now and valid!
const int&i5 = (const int&)i3; // okay too!
Lo anterior puede conducir a un comportamiento indefinido, al escribir a un objeto const inicialmente a través de una referencia a no constante (en realidad, más que la fundición y la lectura no está definido comportamiento en sí mismo. Pero si está rechazando const, también puede escribir en él, lo que arroja el comportamiento indefinido)
¿podría agregar los mensajes de error del compilador? –
uso inválido de const_cast con el tipo 'int 'que no es un puntero, referencia, ni un tipo uso inválido-puntero a los datos de miembros de const_cast con el tipo' const int', que no es un puntero , referencia, ni un tipo de puntero a miembro de datos –