Je viens de réaliser quelque chose de dérangeant. Chaque fois que j'ai écrit une méthode qui accepte un std::string
comme paramètre, je me suis ouvert à un comportement indéfini.
Par exemple, cela ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... peut être appelé comme ça ...
char* s = 0;
myMethod(s);
... et je ne peux rien faire pour l'empêcher (à ma connaissance).
Ma question est donc: comment quelqu'un peut-il se défendre contre cela?
La seule approche qui me vient à l'esprit est de toujours écrire deux versions de toute méthode qui accepte un std::string
comme paramètre, comme ceci:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Est-ce une solution courante et / ou acceptable?
EDIT: Certains ont souligné que je devrais accepter const std::string& s
au lieu de std::string s
comme paramètre. Je suis d'accord. J'ai modifié le post. Je ne pense pas que cela change la réponse.
char* s = 0
défini. Je l'ai vu au moins quelques centaines de fois dans ma vie (généralement sous la forme de char* s = NULL
). Avez-vous une référence pour appuyer cela?
std:string::string(char*)
constructeur
const std::string&
pour ce paramètre ...?)
c_str
propriété de l'objet chaîne ?