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