http://cplusplus.com/reference/string/basic_string/operator []
Я понимаю, что выгодно иметь вторую версию, которая возвращает const
предотвратить предупреждения, когда const
результат требуется и для смягчения приведения, но если функция уже обеспечиваетconst
метод (метод — не результат), то какой смысл объявлять const
метод const
?
Вам нужно понять, что второе (const
) версия не только возвращается другой результат, но также помечен как const
(это второй const
в конце декларации):
const_reference operator[] (size_type pos) const;
Это две разные вещи: const
возвращаемое значение само по себе не потребуется при наличии неconst
метод (поскольку неконстантное возвращаемое значение всегда может быть приведено к const
версия).
Но не имея const
-версия оператора будет означать, что вы не можете использовать его на const
строковые объекты.
const
результат является просто результатом const
Самость оператора: если у вас есть const
строка и используйте оператор, чтобы получить ссылку на один символ, очевидно, эта ссылка также должна быть const
(если нет, вы можете изменить отдельные символы в пределах const
строка).
Предположим, у вас есть
const std::string str{"test"};
std::cout << str[2];
Если у вас нет const
функция-член, приведенный выше код потерпит неудачу, так как this
указатель неявно передан operator[]
является const
,
Если у тебя есть const std::basic_string
ты не можешь позвонить (неконстантно) std::basic_string::operator[]
, так как она, ну, не помечена конст.
Если бы не было const
версия функции, функция не может быть вызвана на const
пример. Например:
void func (const std::string &h)
{
if (h[0] == "hello")
...
}
Как бы это работало, если бы не было const
версия operator[]
?
const
метод возвращает другой тип, он возвращает const
квалифицированная ссылка. Это означает, что если const
метод используется, результат метода const
Квалифицированный (и, следовательно, «неизменный»). Затем на-const
-qualified метод возвращает обычную ссылку, которая является «изменяемой».
Вы не можете иметь просто const
метод или вы не можете изменить отдельные символы вconst
-qualified std::basic_string
объекты. И вы не можете иметь просто Затем на-const
метод или вы не сможете вызвать метод на const
-qualifed std::basic_string
объекты.