web-dev-qa-db-fra.com

Est-il légal de static_cast une string_view à une chaîne

Ma question est motivée par cette réponse sur stackoverflow, https://stackoverflow.com/a/48082010/5360439 . Citer,

Q: Comment convertir un std::string_view En un const char*?

R: Faites simplement une std::string(string_view_object).c_str() pour obtenir une copie temporaire garantie terminée par un caractère nul (et nettoyez-la à la fin de la ligne).

Malheureusement, il construit un nouveau string. Je me demande si c'est OK de faire simplement,

static_cast<string>(string_view_object).c_str()

Maintenant, ma question est:

  1. Est-ce que cela construit une nouvelle chaîne?

  2. Est-il garanti de retourner une séquence de caractères terminée par un caractère nul?

J'ai un petit morceau de code pour la démonstration. Cela semble marcher correctement. (Voir wandbox résultats )

#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;
}
14
JohnKoch

static_cast<std::string>(sv) appelle le std::string::string constructeur qui attend tout type convertible en std::string_view ( plus de détails ). Par conséquent, oui, il crée toujours un tout nouveau std::string objet, qui à son tour garantit une séquence de caractères terminée par un caractère nul.

12
Mário Feroldi