Sto cambiando una vecchia routine che utilizzava un parametro intero in modo che ora assuma un riferimento const a un oggetto. Speravo che il compilatore mi dicesse da dove viene chiamata la funzione (perché il tipo di parametro è sbagliato), ma l'oggetto ha un costruttore che accetta un intero, quindi piuttosto che fallire, il compilatore crea un oggetto temporaneo, passandolo intero e passa un riferimento a quello alla routine. Esempio di codice:Come posso dire al compilatore di non creare un oggetto temporaneo?
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;
}
voglio la linea X an_x(6)
a si compila, perché non c'è X
costruttore che prende un int
. Ma lo fa compilare, e l'output appare come:
Creating a thing(5)
Creating a thing(6)
Creating an X from a thing
Come posso mantenere il costruttore thing(int)
, ma non consentire l'oggetto temporaneo?
Vedere questa risposta: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean – Skizz
Perfect - Ho scritto codice C++ per circa 15 anni, e ho mai sentito parlare della parola chiave esplicita. Grazie! –
Domanda correlata: puoi usare la parola chiave esplicita su un metodo che non è un costruttore? –