Me acabo de dar cuenta de algo inquietante. Cada vez que escribo un método que acepta std::string
un paramater, me abro a un comportamiento indefinido.
Por ejemplo, esto ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... se puede llamar así ...
char* s = 0;
myMethod(s);
... y no hay nada que pueda hacer para evitarlo (que yo sepa).
Entonces mi pregunta es: ¿cómo se defiende alguien de esto?
El único enfoque que viene a la mente es escribir siempre dos versiones de cualquier método que acepte un std::string
parámetro, como este:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
¿Es esta una solución común y / o aceptable?
EDITAR: Algunos han señalado que debería aceptar en const std::string& s
lugar de std::string s
como un parámetro. Estoy de acuerdo. Modifiqué la publicación. Sin embargo, no creo que eso cambie la respuesta.
char* s = 0
no está definido. Lo he visto al menos unos cientos de veces en mi vida (generalmente en forma de char* s = NULL
). ¿Tiene una referencia para respaldar eso?
std:string::string(char*)
constructor
const std::string&
para ese parámetro ...?)
c_str
propiedad del objeto de cadena ?