Проблема с этим кодом ...
std::string_view sv = s + "World\n";
... заключается в том, что sv
не установлен на s
, а на безымянный временный , созданный выражениемs + "world\n"
.Это временное уничтожается сразу после окончания всего выражения (в точке с запятой).
Так что да, это ошибка типа «использовать после освобождения».
Если выЕсли вы хотите продлить срок жизни этого временного , вам нужно присвоить его переменной, которая будет его поддерживать - например, новый объект std::string
:
std::string sv = s + "World\n"; // copy the temporary to new storage in sv
A std::string_view
- это просто«просмотр» на строку, это не строка сама по себе.Он действителен только в том случае, если строка, на которую он «смотрит», действительна.
Здесь есть еще одна странность.Вы также можете привязать временный к const
справочнику , который продлевает срок службы временных:
std::string const& sv = s + "World\n"; // just keep the temporary living
Почему инициализация std::string_view
из временно разрешено?
Я не могу говорить за комитет по стандартам, но я подозреваю, что std::string_view
предполагается использовать в качестве параметра функции, чтобы временные функции могли быть переданы в функцию (как с const ref).Очевидно, что жизненный путь подходит для этого сценария.
Если мы запретим инициализацию для временных пользователей, то основное использование std::string_view
будет отменено.Вы будете вынуждены создать новый std::string
(или привязку к const ref) перед вызовом функции, что сделает процесс неудобным.