Saya menggunakan perpustakaan internal yang dirancang untuk meniru perpustakaan C ++ yang diusulkan , dan kadang-kadang dalam beberapa tahun terakhir saya melihat antarmuka berubah dari menggunakan std::string
ke string_view
.
Jadi saya dengan patuh mengubah kode saya, agar sesuai dengan antarmuka baru. Sayangnya, yang harus saya sampaikan adalah parameter std :: string, dan sesuatu yang merupakan nilai pengembalian std :: string. Jadi kode saya berubah dari sesuatu seperti ini:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
untuk
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()));
}
Saya benar - benar tidak melihat perubahan apa yang saya beli sebagai klien API, selain lebih banyak kode (untuk kemungkinan gagal). Panggilan API kurang aman (karena API tidak lagi memiliki penyimpanan untuk parameternya), mungkin menyimpan program saya 0 bekerja (karena pemindahan optimisasi dapat dilakukan oleh kompiler sekarang), dan bahkan jika itu memang menghemat pekerjaan, itu hanya akan menjadi beberapa alokasi yang tidak dan tidak akan pernah dilakukan setelah startup atau dalam lingkaran besar di suatu tempat. Bukan untuk API ini.
Namun, pendekatan ini tampaknya mengikuti saran yang saya lihat di tempat lain, misalnya jawaban ini :
Sebagai tambahan, karena C ++ 17 Anda harus menghindari melewatkan const std :: string & yang mendukung std :: string_view:
Saya menemukan saran yang mengejutkan, karena tampaknya mengadvokasi secara universal mengganti objek yang relatif aman dengan yang kurang aman (pada dasarnya pointer dan panjang yang dimuliakan), terutama untuk keperluan optimasi.
Jadi kapan seharusnya string_view digunakan, dan kapan seharusnya tidak?
<string>
header dan terjadi secara otomatis. Kode itu menipu dan salah.
std::string_view
konstruktor secara langsung, Anda hanya harus meneruskan string ke metode yang mengambilstd::string_view
langsung dan itu akan secara otomatis dikonversi.