J'utilise une bibliothèque interne qui a été conçue pour imiter une bibliothèque C ++ proposée , et au cours des dernières années, je vois son interface passer de l'utilisation std::string
àstring_view
.
Je change donc consciencieusement mon code, pour me conformer à la nouvelle interface. Malheureusement, ce que je dois transmettre est un paramètre std :: string et quelque chose qui est une valeur de retour std :: string. Donc, mon code a changé de quelque chose comme ceci:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
à
void one_time_setup(const std::string & p1, int p2) {
api_class api;
const std::string p2_storage(special_number_to_string(p2));
api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size()));
}
J'ai vraiment vois pas ce que ce changement m'a apporté en tant que client API, à part plus de code (pour éventuellement bousiller). L'appel d'API est moins sûr (car l'API ne possède plus le stockage pour ses paramètres), a probablement sauvé le travail de mon programme 0 (en raison des optimisations de déplacement que les compilateurs peuvent faire maintenant), et même s'il a économisé du travail, ce ne serait que quelques allocations qui ne seront pas et ne seront jamais faites après le démarrage ou dans une grande boucle quelque part. Pas pour cette API.
Cependant, cette approche semble suivre les conseils que je vois ailleurs, par exemple cette réponse :
En passant, depuis C ++ 17 vous devez éviter de passer un const std :: string & en faveur d'un std :: string_view:
Je trouve ce conseil surprenant, car il semble préconiser le remplacement universel d'un objet relativement sûr par un objet moins sûr (essentiellement un pointeur et une longueur glorifiés), principalement à des fins d'optimisation.
Alors, quand string_view devrait- il être utilisé et quand ne devrait-il pas l'être?
<string>
tête et se produit automatiquement. Ce code est trompeur et faux.
std::string_view
directement le constructeur, vous devez simplement passer les chaînes à la méthode en prenant unstd::string_view
directement et il se convertira automatiquement.