Ho appena realizzato qualcosa di inquietante. Ogni volta che ho scritto un metodo che accetta un std::string
come parametro, mi sono aperto a un comportamento indefinito.
Ad esempio, questo ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... può essere chiamato così ...
char* s = 0;
myMethod(s);
... e non c'è nulla che io possa fare per impedirlo (di cui sono a conoscenza)
Quindi la mia domanda è: come si difende qualcuno da questo?
L'unico approccio che viene in mente è scrivere sempre due versioni di qualsiasi metodo che accetta un std::string
come parametro, come questo:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Questa è una soluzione comune e / o accettabile?
EDIT: alcuni hanno sottolineato che dovrei accettare const std::string& s
anziché std::string s
come parametro. Sono d'accordo. Ho modificato il post. Non penso che cambi la risposta però.