Наткнулся ЭТОТ Пост Херба Саттера «снова», и я начал думать, почему то же самое не может быть справедливо и для константного указателя.
Вот тестовый код
const char* get()
{
std::string a("something");
return a.substr(1, a.size() - 3).c_str();
}
int main()
{
const char* str = get();
std::cout << str << std::endl;
return 0;
}
стандартная строка substr
возвращает новый строковый объект. Компилирование с g++ -Wall
также не дал мне никакой ошибки. Так показывает ли этот пример длительное временное поведение ИЛИ мне здесь просто повезло?
Правило гласит:
«Время жизни временной привязки к постоянная ссылка продолжается до жизни const. «
В вашем примере кода нет ссылки & это не связано с примером кода GOTW. Ваш код просто дает вам неопределенное поведение. В зависимости от того, как вы на это смотрите, вы можете считать себя счастливчиком / неудачником, что это работает.
Важная заметка:
Ссылки не указатели!
Нет, указатель на const
делает не продлить срок службы временного.
Только при привязке временного к ссылка в const
будет ли время жизни увеличено до времени жизни самой ссылки.
{
Foo factory();
const Foo& fooRef = factory();
const Foo* fooPtr = &factory();
fooRef.doSomething(); // OK
fooPtr.doSomething(); // UB, dangling pointer.
}
Вы можете представить, что std :: string просто что-то вроде этого:
class string {
const char *str_;
string(const char *str) {
str_ = new char[strlen(str)];
strcpy(str_, str);
}
~string() {
delete[] str;
}
const char *c_str() {
return str_;
}
}
Итак, после возврата из get () строка будет уничтожена и у вас будет указатель на мусор. Вы можете легко обнаружить эту ошибку с помощью valgrind или подобного инструмента.