Существует неявное преобразование из std::string
в std::string_view
, и оно не считается небезопасным, хотя это, безусловно, может привести к большому количеству оборванных ссылок, если программист не будет осторожен.
С другой стороны, здесь нет неявного преобразования из std::string_view
в std::string
с использованием того же аргумента, но совершенно противоположным образом: потому что программист может быть невнимателен.
Прекрасно, что в С++ есть замена необработанному указателю const char*
, но при этом он становится супер запутанным и урезанным до костей:
- Неявный
const char*
->std::string
: ОК - Неявный
std::string_view
->std::string
: НЕТ - Назначение
std::string
=const char*
: ОК - Назначение
std::string
=std::string_view
: ОК - Добавление
std::string
+=const char*
: ОК - Добавление
std::string
+=std::string_view
: ОК - Объединение
const char*
+std::string
: ОК - Объединение
std::string_view
+std::string
: НЕТ - Объединение
std::string
+const char*
: ОК - Объединение
std::string
+std::string_view
: НЕТ
Я что-то пропустил или это полная ерунда?
В конце концов, насколько полезно это строковое представление без всех важных частей, которые делают его похожим на const char*
? Какой смысл интегрировать его в экосистему stdlib, не делая при этом последнего шага к его завершению? В конце концов, если нам нужен объект, представляющий часть строки, мы можем написать свой собственный. На самом деле многие библиотеки уже сделали это много лет назад. Весь смысл создания чего-то стандартного в том, чтобы сделать его полезным для самых разных вариантов использования, не так ли?
Собираются ли они исправить это в C++23?