Почему std :: basic_string :: operator [] является методом const, если это также неконстантный метод?

http://cplusplus.com/reference/string/basic_string/operator []

Я понимаю, что выгодно иметь вторую версию, которая возвращает const предотвратить предупреждения, когда const результат требуется и для смягчения приведения, но если функция уже обеспечиваетconst метод (метод — не результат), то какой смысл объявлять constметод const?

0

Решение

Вам нужно понять, что второе (const) версия не только возвращается другой результат, но также помечен как const (это второй const в конце декларации):

const_reference operator[] (size_type pos) const;

Это две разные вещи: const возвращаемое значение само по себе не потребуется при наличии неconst метод (поскольку неконстантное возвращаемое значение всегда может быть приведено к const версия).

Но не имея const-версия оператора будет означать, что вы не можете использовать его на const строковые объекты.

const результат является просто результатом constСамость оператора: если у вас есть const строка и используйте оператор, чтобы получить ссылку на один символ, очевидно, эта ссылка также должна быть const (если нет, вы можете изменить отдельные символы в пределах const строка).

4

Другие решения

Предположим, у вас есть

const std::string str{"test"};
std::cout << str[2];

Если у вас нет const функция-член, приведенный выше код потерпит неудачу, так как this указатель неявно передан operator[] является const,

3

Если у тебя есть const std::basic_string ты не можешь позвонить (неконстантно) std::basic_string::operator[], так как она, ну, не помечена конст.

2

Если бы не было const версия функции, функция не может быть вызвана на const пример. Например:

void func (const std::string &h)
{
if (h[0] == "hello")
...
}

Как бы это работало, если бы не было const версия operator[]?

1

const метод возвращает другой тип, он возвращает constквалифицированная ссылка. Это означает, что если const метод используется, результат метода constКвалифицированный (и, следовательно, «неизменный»). Затем на-const-qualified метод возвращает обычную ссылку, которая является «изменяемой».

Вы не можете иметь просто const метод или вы не можете изменить отдельные символы вconst-qualified std::basic_string объекты. И вы не можете иметь просто Затем на-const метод или вы не сможете вызвать метод на const-qualifed std::basic_string объекты.

0