Forbid conversion from std::basic_string to std::basic_string_view

tenzink
tenzink

Consider the following code. This code may look safe, and may not be spotted by the reader:

std::string readSetting(const std::string& fileName);

std::string_view getName() {
std::string path = "settings.ini";
auto name = readSetting(path);
return name; }

In fact, returned string_view points to the internals of already destroyed string.

-5
рейтинг
5 комментариев
yndx-antoshkka
Просто запретить - не получится, люди уже пользуются тем что std::basic_string можно преобразовать к std::string_view.

Нужно найти другой способ, обезопасить себя и пользователей от подобных ошибок.
yndx-antoshkka
h4tred
yndx-antoshkka, у меня год назад как-то так выродилось: htrd.su/wiki/zhurnal/2016/04/29/std_string_view_i_vremennye_obekty, может кто подскажет - какие подводные камни?
h4tred
Andrey Davydov
h4tred, подводный камень в том, что Ваш способ запрещает вызов get_schema(get_url()), но проблема-то не в нем а в сохранении его результата в переменную. При этом такая конструкция if (get_schema(get_url()) == "http") ... совершенно корректна и часто используется на практике. Ровно это обсуждалось по ссылкам из моего комментария ниже.
Andrey Davydov
h4tred
Andrey Davydov, спасибо!
h4tred
Andrey Davydov
Я поднимал аналогичный вопрос касательно boost::string_ref в списке рассылки boost: boost.2283326.n4.nabble.com/utility-string-ref-construction-from-rvalue-reference-to-string-td4665864.html, и как мне совершенно справедливо указали это сломает важнейший use-case когда string конвертируется в string_view для передачи аргумента в функцию.
Как ни странно мэнтейнер boost::string_ref Marshall Clow решил-таки запретить конструирование string_ref от string &&, что привело к поломке кучи кода: boost.2283326.n4.nabble.com/Constructing-string-ref-from-rvalue-string-td4692417.html
Видимо, в C++ не хватает чисто языковых средств, чтобы отличить совершенно корректный случай конструирования string_view при вычислении аргумента функции от всего остального. Остается надеется на внешние tool'ы, скажем, clang-tidy уже умеет отлавливать такого рода ошибки (clang.llvm.org/extra/clang-tidy/checks/misc-dangling-handle.html), и, возможно, вскоре научатся некоторые IDE.
Andrey Davydov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).