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 unconst 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:
Est-ce que cela construit une nouvelle chaîne?
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;
}
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.