Ben mimik a amacıyla tasarlanmış, bir iç kitaplığı kullanıyorum C ++ kütüphanesi önerdi ve bazen son birkaç yıl içinde gördüğüm kendi arayüzü kullanarak değiştirildi std::string
kadar string_view
.
Bu yüzden yeni arayüze uymak için kodumu saygıyla değiştiriyorum. Ne yazık ki, ne geçmek zorunda bir std :: string parametresi ve std :: string dönüş değeri olan bir şeydir. Yani kodum böyle bir şeyden değişti:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
için
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()));
}
Ben gerçekten (muhtemelen berbat) Bu değişikliğin kod dışındaki API istemcisi olarak bana aldığı görmüyorum. API çağrısı daha az güvenlidir (API artık parametreleri için depolama alanına sahip olmadığından), muhtemelen program 0 çalışmamı kaydetti (derleyiciler şimdi yapabilen hareket optimizasyonları nedeniyle) ve iş kaydetmiş olsa bile, bu sadece başlangıçtan sonra veya bir yerde büyük bir döngüde yapılmayacak ve asla yapılmayacak birkaç tahsis. Bu API için değil.
Ancak, bu yaklaşım başka yerlerde gördüğüm tavsiyelere uyuyor gibi görünüyor, örneğin bu cevap :
Bir yana, C ++ 17 beri bir const std :: string & std :: string_view lehine geçmekten kaçınmalısınız:
Öncelikle optimizasyon amacıyla nispeten güvenli bir nesneyi daha az güvenli bir nesneyle (temelde yüceltilmiş bir işaretçi ve uzunluk) değiştirmeyi evrensel olarak savunuyor gibi göründüğü için bu tavsiyeyi şaşırtıcı buluyorum.
Yani ne zaman gerektiğini string_view kullanılabilir, ve ne zaman gerekmez mi?
<string>
başlıkta ve otomatik olarak gerçekleşiyor. Bu kod aldatıcı ve yanlış.
std::string_view
yapıcıyı doğrudan çağırmak zorunda kalmamalısınız, sadece dizeleristd::string_view
doğrudan alarak yönteme geçirmelisiniz ve otomatik olarak dönüşecektir.