std::string_view + c_str()

edc0a91c24342ae88891
edc0a91c24342ae88891

Добавить метод по типу at(), только c_str(), который будет в рантайме проверять - является ли строка в string_view си-строкой и возвращать data(), либо - выкидывать эксепшн. Так же, можно реализовать is_cstr() - это позволит сделать проверку без исключений.

-2
рейтинг
9 комментариев
Andrey Davydov

А как можно сделать такую проверку?

Andrey Davydov
edc0a91c24342ae88891

Andrey Davydov, элементарно.

edc0a91c24342ae88891
Andrey Davydov

edc0a91c24342ae88891, спасибо за развернутый ответ.

Судя по другим Вашим ответам, Вы предлагаете, чтобы is_str() содержал UB, скажем, для такого случая:

const char c = 'x'; string_view(&c, 1).is_str();

Andrey Davydov
yndx-antoshkka

Вы предлагаете сделать, чтобы string_view запоминал строчку с терминирующим 0 а при запросе size() приверял последний символ и вычитал при необходимости 1 из хранимого внутри size_? Или что-то другое?

yndx-antoshkka
edc0a91c24342ae88891

yndx-antoshkka,нет, string_view может "запоминать" какую угодно строку, но при c_str() проверял, что символ за последним - ноль. Такое может не прокатить для стандартизации, т.к. это может быть "выход за границы"(хотя это и обходится на уровне реализации, но всё же - может где-то не обходится).

 

 

Более общее решение - это добавить флаг, который может быть констекпр(если нам когда-то завезут нормальный констекспр). Либо, можно добавить c_str_view(), который будет прозрачно приводиться к string_view.

edc0a91c24342ae88891
Дмитрий

Я так понял при доступе через c_str() предлагается проверять, инициализирован ли std::string_view?

Дмитрий
edc0a91c24342ae88891

Дмитрий, нет, string_view может в себе хранить си-строку, но мы не может знать, что она там есть. Таким образом, string_view не может быть заменой char *( как он везде рекламировался), а только заменой char *, size_t.

 

А c_str() должна проверять - находится ли в string_view си-строка, либо нет. 

edc0a91c24342ae88891
Дмитрий

edc0a91c24342ae88891, string_view хранит указатель на начало строки и её размер. Что значит "мы не можем знать, что она там есть"? На сколько я знаю, string_view всегда инициализирован строкой?

Дмитрий
edc0a91c24342ae88891

Дмитрий, элементрно. Тут я хотел рассказать про контекст, но ладно. Если попроще. Вопрос задан в контексте си-строки, c_str() возвращает си-строку. Указатель+длинна может указывать на какой угодно кусок строки, либо строку, которая никак не обязана заканчиваться нулём.

 

 

Таким образом мы никогда не знаем - что находится в string_view. Допустим, мы делаем constexpr std::string_view{"hello"}, и казалось бы - мы точно знаем, что это си-строка и можем использовать ::data() как си-строку, но это бекдор.

 

Зачем это нужно я говорил выше. string_view претендует на замену char *, но он не умеет работать с си-строками. Да, он может быть инициилизирован из си-строки, но получить си-строку обратно - нельзя. В этом проблема.

edc0a91c24342ae88891
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения