2010-09-27 15 views
9

todo: esta es una cita del Efectiva C++ tercera editiionPregunta sobre const_cast en C++

const_cast se suele utilizar para desechar el constness de objetos. Es el único elenco de estilo C++ que puede hacer esto.

Mi pregunta es ¿puede const_cast agregar constness a un objeto no const? En realidad, escribí un pequeño programa tratando de aprobar mi pensamiento.

class ConstTest 
{ 
public: 

void test() { 
    printf("calling non-const version test const function \n"); 
} 

void test() const{ 
    printf("calling const version test const function \n"); 

} 

}; 
int main(int argc,char* argv){ 
ConstTest ct; 
const ConstTest cct; 
cct.test(); 
const_cast<const ConstTest&>(ct).test();//it is wrong to write this statement without the '&',why 

} 

Omitiendo el error '&' incurre a continuación: C2440

error: 'const_cast': no ​​se puede convertir de 'ConstTest' a 'ConstTest const'

muestra que const_cast puede agregar constness, pero parece que tienes que lanzar a una referencia de objeto, ¿cuál es la magia de esta referencia?

+0

¿Por qué usaría const_cast para agregar const? Simplemente asigne el objeto no const a una variable const y termine. No tengo idea de por qué la referencia constante funciona en tu caso. –

+2

Supongamos que una función miembro tiene una anulación const y non const: ¿cómo se llama a la anulación const en un objeto no const sin hacer una copia?(La respuesta es 'static_cast', pero no está claro de inmediato por qué' const_cast' tampoco debería funcionar para esto) –

+0

@Tyler: se lanza a una referencia constante, por ejemplo con 'static_cast'. –

Respuesta

6

No es necesario añadir const_cast constness:

class C; 
C c; 
C const& const_c = c; 

El revés necesita un const_cast aunque

const C const_c; 
C& c = const_cast<C&>(const_c); 

pero el comportamiento no está definido si se intenta utilizar las operaciones no constante en c.

Por cierto, si usted no utiliza una referencia, una copia del objeto se habrá hecho:

C d = const_c; // Copies const_c 
+0

Aún así, agregar 'const' _sometimes_ es útil, porque permite un código más conciso que al agregar una variable adicional (de referencia). Consulte la mitad inferior de esta página: http://books.google.de/books?id=mT7E5gDuW_4C&pg=PA188. Tenga en cuenta que puede, como [sharptooth señaló correctamente] (http://stackoverflow.com/questions/3803521/question-about-const-cast-in-c/3803545#3803545), solo se puede usar para convertir a 'const '_reference_. – sbi

+0

¿por qué eliminar la constness de const_c no está definido? ¿Qué pasa si es un tipo incorporado, es decir. char, int, bool, etc. – Tracy

+0

El comportamiento no está indefinido, a menos que intente utilizar la referencia no constante para modificar el objeto const. –

2

const_cast sólo se puede utilizar para echar a los punteros y referencias. No se puede usar para lanzar a objetos. He aquí por qué: si tienes un objeto const no puedes convertirlo en no const y viceversa - ya es const, no puedes redeclararlo. Solo puede intentar acceder a él a través de un puntero o referencia sin (o con) const.

1

const_cast no se puede modificar la consistencia del valor. Entonces devuelve una referencia constante al valor.

2

const_cast también se puede utilizar para agregar constness.

$5.2.11/3 - "For two pointer types T1 and T2 where 

T1 is cv1 , 0 pointer to cv1 , 1 pointer to . . . cv1 ,n − 1 pointer to cv1 ,n T 
and 
T2 is cv2 , 0 pointer to cv2 , 1 pointer to . . . cv2 ,n − 1 pointer to cv2 ,n T 

where T is any object type or the void type and where cv1 ,k and cv2 ,k may be different cv-qualifications, an rvalue of type T1 may be explicitly converted to the type T2 using a const_cast. The result of a pointer const_cast refers to the original object. 

considerar:

int *t1 = NULL; // T = int, cv1, 0 = none 
int * const t2 = const_cast<int * const>(t1); // T = int, cv2, 0 = const 

De acuerdo con la cita anterior, lo anterior es fina y se añade constness a t

Pero como Herb Sutter dice, es probable que no se requiere explícitamente que hacerse La mayoría de las veces.

+0

He leído bastantes libros, ninguno de ellos mencionado alguna vez usando const_cast para agregar constness a un objeto u objeto de referencia? Sin embargo, lo que encontré es usar static_cast para lograr lo mismo que introdujo en Effective C++ de Scott Meyers.OOps, no se pudo vincular al libro de google – Tracy

+0

@Tracy: http://lookdit.wordpress.com/2010/05/27/ c-common-knowledge-by-stephen-c-dewherst/(Ver el punto 9) – Chubsdad