Size: a a a

2020 August 05

АК

Александр Караев... in pro.cxx
Гласси Hudobin
ну с точки зрения здравого смысла substr от неизменяемой строки как раз должен быть вьюхой.
это очень субъективно
источник

ГH

Гласси Hudobin in pro.cxx
magras
Так это проблема string, а не view.
Ну вот я например, когда этот код увидел как пример UB, я хз где там UB.
источник

ГH

Гласси Hudobin in pro.cxx
Пришлось комментарии читать.
источник

m

magras in pro.cxx
В целом я согласен, что string_view это опасный инструмент. Но что поделать, borrow checker'а у нас еще нет.
источник

ПК

Побитый Кирпич... in pro.cxx
Гласси Hudobin
{ std::string_view ret = str.substr(1); return ret; } // здесь же будет висячая ссылка?
Если заменить string_view на const std::string&, то то же самое UB будет. То есть это никак не относится к string_view, оно тут ничего не ухудшило
источник

ПК

Побитый Кирпич... in pro.cxx
ты вернул ссылку на локальную переменную считай
источник

ПК

Побитый Кирпич... in pro.cxx
Это всегда уб было
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Побитый Кирпич
Если заменить string_view на const std::string&, то то же самое UB будет. То есть это никак не относится к string_view, оно тут ничего не ухудшило
Почему с const std::string& уб?
источник

ПК

Побитый Кирпич... in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
Почему с const std::string& уб?
Потому же почему со string_view уб
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Побитый Кирпич
Потому же почему со string_view уб
const std::string&
продлевает время жизни. Если возвращаемое значение это ссылка/вью, то уб
источник

ГH

Гласси Hudobin in pro.cxx
Ссылка для экспериментов: https://godbolt.org/z/z8fMxq
источник

AK

Anton Kviatkovskii in pro.cxx
Побитый Кирпич
Потому же почему со string_view уб
Не, тут же другая история
const std::string& реально продлит время жизни объекта
источник

AK

Anton Kviatkovskii in pro.cxx
А c string_view оно умрёт в конструкторе
источник

ПК

Побитый Кирпич... in pro.cxx
Ну теперь замени string_view на const std::string&
источник

ГH

Гласси Hudobin in pro.cxx
clang ругается.
источник

D

Dmitriy in pro.cxx
Так substr в любом случае возвращает временный объект
источник

ПК

Побитый Кирпич... in pro.cxx
Гласси Hudobin
clang ругается.
Ну т.е. уб неоткуда не появилось новое
источник

ГH

Гласси Hudobin in pro.cxx
а вот так нет: std::string_view ret = std::string_view(str).substr(1);
источник

ПК

Побитый Кирпич... in pro.cxx
Anton Kviatkovskii
А c string_view оно умрёт в конструкторе
Из функции всё равно ссылка выходит, так что это неважно
источник

m

magras in pro.cxx
Anton Kviatkovskii
А c string_view оно умрёт в конструкторе
Это не совсем точная формулировка. Временный объект строки будет жить до конца выражения. То есть конструтор string_view отработает корректно. Но после ; временный объект будет разрушен и view будет указывать на освобожденную память.
источник