Почему методы доступа 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>
,
Помните, что "практическое правило" - это правило, а не правило.