Является ли хорошей практикой замена «const std::string &» на «std::string_view» или просто «std::string»?

Я всегда предпочитал const std::string &, когда мне нужно было играть с std::string. Но недавно я вдруг заметил, что const std::string & вообще не нужно использовать. std::string_view лучше подходит для строк, доступных только для чтения, и только std::string с move лучше подходит для других целей (настройка строковых полей и т. д.).

// Read-only string example
bool foo(std::string_view bar) {
    return bar == "baz";
}
// Non read-only string example
void MyClass::foo(std::string bar) {
    this->baz = std::move(bar);
}

В приведенных выше двух случаях const std::string & не является оптимальным!

Поэтому я решил удалить все const std::string & и заменить их одним из них. Итак, мой вопрос:

  1. Будет ли ситуация, в которой const std::string & будет лучше?
  2. Если нет, понадобится ли мне const std::string &?

Спасибо.


person AcrylicShrimp    schedule 29.11.2019    source источник
comment
Представление также лучше при вызове функции с литеральной строкой, поскольку из нее не нужно создавать временную std::string. Или это то, что вы имели в виду под строкой только для чтения?   -  person Shawn    schedule 29.11.2019
comment
@Shawn Я имею в виду, что read-only string - это строки, которые не изменяются в функции. Да, его можно создать из литералов или ссылки на существующий экземпляр строки.   -  person AcrylicShrimp    schedule 29.11.2019
comment
@AcrylicShrimp, std::string содержит строку, заканчивающуюся нулем, поэтому значение, возвращаемое методом c_str(), может быть передано непосредственно в одну из функций (особенно при работе с c-функциями), которая ожидает в качестве входного аргумента строку c, завершающуюся нулем. И наоборот, это нельзя сделать, используя только std::string_view (в этом случае вам нужно создать буфер, который будет содержать заканчивающуюся нулем c-строку).   -  person Deedee Megadoodoo    schedule 29.11.2019
comment
@RealFresh Но каждый std::string_view, созданный std::strings и строковыми литералами, будет заканчиваться нулем, верно?   -  person AcrylicShrimp    schedule 29.11.2019
comment
Нет, если это представление подстроки.   -  person Shawn    schedule 29.11.2019
comment
Чего я до сих пор не понимаю (с std::string_view): для немета-программирования, когда функция ожидает const std::string& (и не может быть изменена, потому что это сторонняя программа или слишком много усилий), необходимо скопировать std::string_view (и даже явно), в то время как std::string идеально подходит. (Новые причудливые функции также имеют недостатки, если вы привязаны к большой, долгоживущей кодовой базе — мой печальный опыт.) Или я что-то упустил?   -  person Scheff's Cat    schedule 29.11.2019
comment
В случае установщика пользователь может использовать его неправильно и создать дополнительную копию (std::string s = f(); foo(s) вместо foo(std::move(s));). Ожидание std::string&& заставит пользователя сделать копию явно.   -  person Jarod42    schedule 29.11.2019
comment
Я также хочу знать, можем ли мы удалить все const std::vector<T>& v и заменить их на c++20 span<const T>.   -  person 康桓瑋    schedule 29.11.2019