Есть 2 разных оператора []. Один const, один не const.
Оператор const- [] возвращает const-ссылку, и поэтому значение в индексе нельзя изменить.
Обычный итератор неконстантный, это означает, что компилятор может подумать, что вы можете изменить вектор. В конце концов, вы можете передать итератор в функцию, и тогда компилятор не сможет гарантировать, что вызываемая функция не изменит содержимое итератора / вектора.
Следовательно, существует также const_iterator. Const_iterator нельзя использовать для изменения значений в векторе. Это может быть проверено непосредственно компилятором.
Если вы передадите const_iterator функции, компилятор может только предполагать, что вызываемая функция ведет себя так, как и должно быть, а именно, не изменяя то, на что указывает const_iterator.