Я только что понял, что-то беспокоит. Каждый раз, когда я писал метод, который принимает 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
свойство строкового объекта ?