Я только что понял, что-то беспокоит. Каждый раз, когда я писал метод, который принимает a std::stringв качестве параметра, я открывал себя для неопределенного поведения.
Например, это ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... можно назвать так ...
char* s = 0;
myMethod(s);
... и я ничего не могу сделать, чтобы предотвратить это (о чем я знаю).
Итак, мой вопрос: как кто-то защищает себя от этого?
Единственный подход, который приходит на ум, - это всегда писать две версии любого метода, который принимает std::stringв качестве параметра, например:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Это общее и / или приемлемое решение?
РЕДАКТИРОВАТЬ: Некоторые указали, что я должен принять, const std::string& sа не std::string sв качестве параметра. Я согласен. Я изменил пост. Я не думаю, что это меняет ответ, хотя.
char* s = 0это не определено. Я видел это по крайней мере несколько сотен раз в своей жизни (обычно в форме char* s = NULL). У вас есть ссылка, чтобы подтвердить это?
std:string::string(char*)конструктор
const std::string&для этого параметра ...?)
c_strсвойство строкового объекта ?