2008-12-16 9 views
7

¿Por qué es lo siguiente ?:C++ en lugar de C-estilo arroja

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 
+0

¿podría agregar los mensajes de error del compilador? –

+0

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 –

Respuesta

0

Para el primer error. const_cast solo se puede usar en punteros o tipos de referencia. "int" es ninguno de los dos. Este puede o no ser el estándar de C++ (no se pudo encontrar una buena referencia). Pero es el caso de ciertas implementaciones como el compilador C++ de MS.

Para el segundo error. const_cast solo se puede usar para eliminar un const o un calificador volátil que no lo agregue.

Referencia: http://msdn.microsoft.com/en-us/library/bz6at95h(VS.80).aspx

+1

El operador const_cast (C++ solamente) Un operador const_cast se usa para agregar o eliminar un modificador const o volátil ao desde un tipo. De: http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/language_ref/keyword_const_cast.htm –

20
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)

+0

¿Es realmente un comportamiento indefinido simplemente ¿TIENE una referencia no const a un objeto const?Pensé que en realidad tenías que intentar modificarlo. Tu ejemplo no accede a i2 en absoluto; solo lo define. –

+0

¿Hay alguna situación en la que un molde de estilo C de (int) a (const int) o de (const int) a (int) sería útil, ya que const_cast y const_cast no están permitidos? –

+0

kenny, no, no hay situaciones. no hay valores constantes de tipo integrado. así que esos serían ilegales o simplemente lo mismo que "int" (depende de lo que dice el estándar, no he buscado en la escuela actualmente) –

5

Es un error porque el estándar dice que no está permitido. El estándar enumera los tipos de conversiones que const_cast tiene permitido hacer, y no permite nada que no esté en la lista. Permite el siguiente:

  • Punteros
  • Referencias
  • miembros triples

Desde sus tipos no son ninguna de ellas, que no está permitido.

En el lado positivo, los ejemplos que proporcionó no necesitanconst_cast, tampoco.

Cuestiones relacionadas