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