Да, вы должны написать:
const std::string& getString() const noexcept { return someString; }
Вместо (примечание: не const
, потому что никогда не возвращать const
значений):
std::string_view getString() const noexcept { return someString; }
Причина -у вас уже есть string
.Так что вам не нужно ничего доплачивать, чтобы получить string
из этого.И string
имеет одно заметное семантическое отличие от произвольного string_view
: это с нулевым символом в конце по гарантии.Мы знаем это.Возможно, какой-то нижестоящий пользователь должен полагаться на эту информацию.Если им нужно нулевое завершение (например, им нужно перейти на какой-то C API, который требует этого), и вы даете string_view
, они должны сами сделать из него string
.Вы ничего не экономите, но потенциально заставляете нижестоящих пользователей выполнять больше работы.
Если бы вместо этого у вас было vector<char>
... тогда я бы предложил вернуть span<char const>
или его эквивалент.Поскольку семантической разницы нет, а вы просто предоставляете представление.
Там также отдельный аргумент о том, что:
auto x = obj.getString();
должен делать.Для этого требуется либо копия string
(дорогая, но безопасная), либо фактически ссылка на нее (дешевая, но потенциально висящая).Но это не совсем похоже на ссылку, это выглядит как значение.Это широкая проблема со ссылочно-семантическими типами в целом (такие вещи, как reference_wrapper
, string_view
, span
, tuple<T&...>
, optional<T&>
, если таковые существуют, и т. Д.).
ДонУ меня нет ответа на этот случай, но об этом нужно знать.