Я використовую внутрішню бібліотеку, яка була створена для імітації запропонованої бібліотеки C ++ , і десь за останні кілька років я бачу, що її інтерфейс змінився від використання std::string
на string_view
.
Тож я достойно змінюю свій код, щоб відповідати новому інтерфейсу. На жаль, те, що мені потрібно передати, - це параметр std :: string, а також те, що є поверненим значенням std :: string. Тому мій код змінився з чогось такого:
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()));
}
Я дійсно не бачу, що ця зміна придбала мене як клієнта API, окрім більшого коду (можливо, накручується). Виклик API менш безпечний (через те, що API більше не володіє сховищем для його параметрів), ймовірно, врятував мою програму 0 роботи (завдяки компіляторам оптимізацій переміщення зараз можна зробити), і навіть якщо це збереже роботу, це було б лише пара виділень, які не будуть і ніколи не будуть зроблені після запуску або десь у великому циклі. Не для цього API.
Однак, схоже, цей підхід дотримується порад, які я бачу в інших місцях, наприклад, у цій відповіді :
На відміну від C ++ 17 вам слід уникати передачі const std :: string & на користь std :: string_view:
Я вважаю цю пораду дивовижною, оскільки, здається, пропонується повсюдна заміна відносно безпечного об'єкта на менш безпечний (в основному прославлений покажчик і довжина), насамперед для оптимізації.
Отже, коли слід використовувати string_view, а коли не слід?
<string>
заголовку і відбувається автоматично. Цей код є обманним і неправильним.
std::string_view
конструктор безпосередньо, вам слід просто передати рядки методуstd::string_view
прямого і він автоматично перетвориться.