У меня есть string_view
класс, который предназначен, чтобы быть заменой для std::string
:Убедитесь, что string_view не переживет его объект строки
struct string_view {
/* implicit */ string_view(const std::string& s) : ptr_(s.c_str()), size_(s.size()) {}
// other ctors...
const char* ptr_;
size_t size_;
};
Однако пока все нормально писать
void f(string_view sv);
f(std::to_string(123));
string_view
не может пережить временный строковый объект, это привело бы к UB (использование после освобождения)
string_view g(string_view sv) { return sv; }
string_view sv = g(std::to_string(123));
sv[0];
Другого случай UB:
string_view sv = std::to_string(123);
sv[0];
Есть ли способ поймать такие ошибки во время компиляции? (Помимо плагина Clang).
Никогда не храните * строковый вид. Это не то, для чего. Используйте только временные представления для * просмотра * строки. –
Ржавчина имеет время жизни в свое время. C++ - нет. Вы должны использовать/написать некоторый статический анализатор, чтобы уловить некоторые из этих злоупотреблений для C++. – Jarod42
Основное использование представлений - это аргумент для функций, вместо передачи char [] вы передаете представление. не используйте что-то другое. –