Acabei de perceber algo perturbador. Toda vez que escrevo um método que aceita a std::string
como parâmetro, eu me abro a um comportamento indefinido.
Por exemplo, isso ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... pode ser chamado assim ...
char* s = 0;
myMethod(s);
... e não há nada que eu possa fazer para evitá-lo (que eu saiba).
Então, minha pergunta é: como alguém se defende disso?
A única abordagem que vem à mente é sempre escrever duas versões de qualquer método que aceite a std::string
como 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));
}
}
Esta é uma solução comum e / ou aceitável?
Edição: Alguns salientaram que eu deveria aceitar em const std::string& s
vez de std::string s
como um parâmetro. Concordo. Eu modifiquei a postagem. Acho que isso não muda a resposta.
char* s = 0
é indefinido. Eu já vi isso pelo menos algumas centenas de vezes na minha vida (geralmente na forma de char* s = NULL
). Você tem uma referência para fazer backup disso?
std:string::string(char*)
construtor
const std::string&
para esse parâmetro ...?)
c_str
propriedade do objeto string ?