Допустимо ли static_cast string_view в строку - PullRequest
0 голосов
/ 16 января 2019

Мой вопрос мотивирован этим ответом на stackoverflow, https://stackoverflow.com/a/48082010/5360439. Цитировать,

В: Как конвертировать std::string_view в const char*?

A: Просто выполните std::string(string_view_object).c_str(), чтобы получить гарантированную временную копию с нулевым символом в конце (и очистите ее в конце строки).

К сожалению, он создает новый string. Мне интересно, если это нормально, просто сделать,

static_cast<string>(string_view_object).c_str()

Теперь мой вопрос:

  1. Создает ли это новую строку?

  2. Гарантируется ли возвращение последовательности символов с нулем в конце?

У меня есть небольшой фрагмент кода для демонстрации. Вроде нормально работает. (См. 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;
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Простой способ проверить, создает ли 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.

0 голосов
/ 16 января 2019

static_cast<std::string>(sv) вызывает конструктор std::string::string, который ожидает преобразование любого типа в std::string_view ( более подробно ).Поэтому да, он все еще создает новый объект std::string, который, в свою очередь, гарантирует последовательность символов с нулевым символом в конце.

...