Почему методы доступа const в std::string возвращают ссылку?

std::string аксессоры (back, front, at, а также operator[]) иметь const и не const перегрузки, как показано ниже:

char& x();
const char& x() const;

Почему вторая версия возвращает const ссылка, в отличие от простого возврата char по значению (как копия)?

В соответствии с практическими рекомендациями о том, как передавать объекты, не следует ли передавать небольшие объекты по значению, когда нет необходимости изменять оригинал?

2 ответа

Решение

Поскольку вызывающая сторона может захотеть ссылку на символ, который отражает любые изменения, внесенные в него через неконстантные пути.

std::string str = "hello";
char const& front_ref = static_cast<std::string const&>(str).front();
str[0] = 'x';
std::cout << front_ref; // prints x

Потому что контекст.

Вы имеете дело с контейнером и функциями с именами, которые подразумевают определенные позиционные данные.

std::string s = "hello world?";
const auto& s1 = s.back();
s.back() = '!';

Возврат ссылки здесь обеспечивает гибкость, это также согласуется с неконстантными вариантами и другими контейнерами stl. Ведь эти функции на самом деле являются членами std::basic_string<char>,

Помните, что "практическое правило" - это правило, а не правило.

Другие вопросы по тегам