Estoy usando una biblioteca interna que fue diseñada para imitar una biblioteca C ++ propuesta , y en algún momento en los últimos años veo que su interfaz cambió de usar std::string
a string_view
.
Así que obedientemente cambio mi código, para adaptarme a la nueva interfaz. Desafortunadamente, lo que tengo que pasar es un parámetro std :: string, y algo que es un valor de retorno std :: string. Entonces mi código cambió de algo como esto:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
a
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()));
}
Yo realmente no veo lo que este cambio me compró como el cliente de API, que no sea más código (posiblemente a meter la pata). La llamada a la API es menos segura (debido a que la API ya no posee el almacenamiento para sus parámetros), probablemente guardó el trabajo de mi programa 0 (debido a las optimizaciones de movimiento que los compiladores pueden hacer ahora), e incluso si ahorrara trabajo, eso solo sería un par de asignaciones que no se realizarán y nunca se realizarán después del inicio o en un gran bucle en alguna parte. No es para esta API.
Sin embargo, este enfoque parece seguir los consejos que veo en otros lugares, por ejemplo, esta respuesta :
Por otro lado, desde C ++ 17 debe evitar pasar un const std :: string & a favor de un std :: string_view:
Encuentro sorprendente este consejo, ya que parece estar abogando por el reemplazo universal de un objeto relativamente seguro por uno menos seguro (básicamente un puntero y una longitud glorificados), principalmente con fines de optimización.
Entonces, ¿cuándo se debe usar string_view y cuándo no?
<string>
encabezado y sucede automáticamente. Ese código es engañoso e incorrecto.
std::string_view
constructor directamente, solo debe pasar las cadenas al método que toma unstd::string_view
directamente y se convertirá automáticamente.