Допустимо ли static_cast string_view в строку
Мой вопрос мотивирован этим ответом на stackoverflow, qaru.site/info/2447329/.... Цитировать,
Q: Как вы конвертируете std::string_view
в const char*
?
A: Просто выполните std::string(string_view_object).c_str()
чтобы получить гарантированную временную копию с нулевым символом в конце (и очистите ее в конце строки).
К сожалению, он создает новую string
. Мне интересно, если это нормально, просто сделать,
static_cast<string>(string_view_object).c_str()
Теперь мой вопрос:
-
Создает ли это новую строку?
-
Гарантируется ли возвращение последовательности символов с нулевым символом в конце?
У меня есть небольшой кусок кода для демонстрации. Вроде нормально работает. (См. Результаты Wandbox)
#include <string>
#include <iostream>
#include <string_view>
#include <cstring>
int main()
{
std::string str{"0123456789"};
std::string_view sv(str.c_str(), 5);
std::cout << sv << std::endl;
std::cout << static_cast<std::string>(sv) << std::endl;
std::cout << strlen(static_cast<std::string>(sv).c_str()) << std::endl;
}
Ответы
Ответ 1
static_cast<std::string>(sv)
вызывает конструктор std::string::string
который ожидает преобразования любого типа в std::string_view
(более подробно). Следовательно, да, он по-прежнему создает новый объект std::string
, который в свою очередь гарантирует последовательность символов с нулевым символом в конце.
Ответ 2
Простой способ проверить, static_cast<std::string>(sv)
ли static_cast<std::string>(sv)
новую строку, - проверить, может ли она изменить исходную строку.
#include <string>
#include <iostream>
#include <string_view>
#include <cstring>
int main()
{
std::string str{"0123456789"};
std::string_view sv = str;
std::cout << sv << std::endl;
static_cast<std::string>(sv)[0] = 'a';
std::cout << static_cast<std::string>(sv) << std::endl;
}
sv
остается неизменным, поэтому он создает новую строку.
Посмотреть результаты на wandbox.