Перегрузка константных и неконстантных операторов

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

// non-const
double &operator[](int idx) {
    if (idx < length && idx >= 0) {
        return data[idx];
    }
    throw BoundsError();
}

Я понимаю, что эта функция часть класса, берет индекс и проверяет его логичность, возвращает индекс данных массива в классе. Также есть функция с тем же телом, но с вызовом функции

const double &operator[](int idx) const

Зачем нам две версии?

Этот типовой вопрос также может помочь уточнить. Какая версия используется в каждом случае ниже?

Array a(3);
a[0] = 2.0;
a[1] = 3.3;
a[2] = a[0] + a[1];

Моя гипотеза о том, что const версия вызывается только наa[2] потому что мы не хотим рисковать изменениемa[0] или жеa[1].

Спасибо за любую помощь.

Ответы на вопрос(2)

Ваш ответ на вопрос