Acabei de perceber algo perturbador. Toda vez que escrevo um método que aceita a std::stringcomo 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::stringcomo 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& svez de std::string scomo 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¶ esse parâmetro ...?)
c_strpropriedade do objeto string ?