Sto usando una libreria interna progettata per imitare una libreria C ++ proposta e in alcuni anni ho visto la sua interfaccia cambiata dall'uso std::string
a string_view
.
Quindi cambio doverosamente il mio codice, per adeguarmi alla nuova interfaccia. Sfortunatamente, ciò che devo passare è un parametro std :: string e qualcosa che è un valore di ritorno std :: string. Quindi il mio codice è cambiato da qualcosa del genere:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
per
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()));
}
Io davvero non capisco che cosa questo cambiamento mi ha comprato come il client API, diverso da quello più codice (possibilmente rovinare). La chiamata API è meno sicura (a causa dell'API che non possiede più l'archiviazione per i suoi parametri), probabilmente ha salvato il mio programma 0 di lavoro (a causa di ottimizzazioni di spostamento che i compilatori possono fare ora), e anche se risparmiasse lavoro, sarebbe solo un paio di allocazioni che non verranno e non verrebbero mai eseguite dopo l'avvio o in un grande ciclo da qualche parte. Non per questa API.
Tuttavia, questo approccio sembra seguire i consigli che vedo altrove, ad esempio questa risposta :
A parte questo, dal C ++ 17 dovresti evitare di passare una const std :: string e in favore di una std :: string_view:
Trovo sorprendente questo consiglio, poiché sembra sostenere la sostituzione universale di un oggetto relativamente sicuro con un oggetto meno sicuro (sostanzialmente un puntatore e una lunghezza glorificati), principalmente a fini di ottimizzazione.
Quindi quando usare string_view e quando no?
<string>
nell'intestazione e si verifica automaticamente. Quel codice è ingannevole e sbagliato.
std::string_view
direttamente il costruttore, devi solo passare le stringhe al metodo prendendostd::string_view
direttamente un metodo e questo si convertirà automaticamente.