Я использую внутреннюю библиотеку, которая была разработана для имитации предложенной библиотеки 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
непосредственно, и он будет автоматически преобразован.