2010-02-24 16 views
14

tengo este ejemplo de código:operador de fundición - const vs no constante

class Number 
{ 
    int i; 
    public: 
    Number(int i1): i(i1) {} 
    operator int() const {return i;} 
}; 

¿Cuáles son las consecuencias de la supresión del modificador const del operador de fundición? ¿Afecta el autocolado y por qué?

Respuesta

28

Si el operador de conversión no es constante, no se puede convertir objetos const:

const Number n(5); 
int x = n; // error: cannot call non-const conversion operator 
+1

+1 - bien ganado. Hmmm - Quiero lanzar el valor tomado de un objeto const, pero no puedo, porque la conversión (que no modifica el valor fuente) no es const. Deténgase, mire y piense, y el razonamiento es obvio: no es diferente de cualquier otro método. Pero sigo escuchando el tema de la zona crepuscular. La constness (al menos lógica) de la fuente es parte del comportamiento esperado del método, lo que significa "conversión". Pero, de nuevo, las reglas consistentes son, al menos, consistentes. – Steve314

5

Se puede llamar a la versión const independientemente de si la instancia class Number es const o no. Si el operador se declara no const, solo se puede invocar en entidades no const: cuando intente usarlo implícitamente donde no se pueda invocar, obtendrá un error de compilación.

+0

¿Querías decir "solo ser llamado en * entidades no const *"? – legends2k

+0

@ legends2k: Sí, corregido. Gracias. – sharptooth

5

Si usted tiene una función como esta:

void f(const Number& n) 
{ 
    int n1 = n; 
} 

que comenzará a dar error de compilación si eliminar const en el operador de casting.

Cuestiones relacionadas