Estoy cambiando una rutina anterior que solía tomar un parámetro entero para que ahora tome una referencia constante a un objeto. Esperaba que el compilador me dijera de dónde se llama la función (porque el tipo de parámetro es incorrecto), pero el objeto tiene un constructor que toma un entero, así que en lugar de fallar, el compilador crea un objeto temporal, pasando el entero, y pasa una referencia a eso a la rutina. Código de ejemplo:¿Cómo puedo decirle al compilador que no cree un objeto temporal?
class thing {
public:
thing(int x) {
printf("Creating a thing(%d)\n", x);
}
};
class X {
public:
X(const thing &t) {
printf("Creating an X from a thing\n");
}
};
int main(int, char **) {
thing a_thing(5);
X an_x(6);
return 1;
}
Quiero la línea X an_x(6)
a no compila, porque no hay X
constructor que toma un int
. Pero sí compilar, y la salida se ve como:
Creating a thing(5)
Creating a thing(6)
Creating an X from a thing
¿Cómo puedo mantener el constructor thing(int)
, pero no permitir que el objeto temporal?
Ver esta respuesta: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean – Skizz
Perfecto - He estado escribiendo código C++ durante unos 15 años, y tengo nunca he oído hablar de la palabra clave explícita. ¡Gracias! –
Pregunta relacionada: ¿puedes usar la palabra clave explícita en un método que no sea un constructor? –