Я щойно зрозумів щось тривожне. Кожного разу, коли я писав метод, який приймає параметр 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));
}
}
Це загальне та / або прийнятне рішення?
EDIT: Деякі вказували, що я повинен приймати const std::string& sзамість цього std::string sпараметра. Я згоден. Я змінив публікацію. Я не думаю, що це змінює відповідь.
char* s = 0це не визначено. Я бачив це принаймні кілька сотень разів у своєму житті (як правило, у формі char* s = NULL). Чи є у вас посилання на це?
std:string::string(char*)конструктора
const std::string&цей параметр ...?)
c_strвластивість об'єкта string ?