Sobrecarga do Operador Const e Não Const

Eu tenho um tópico que eu estou confuso sobre o que eu preciso de alguma elaboração. É a sobrecarga do operador com uma versão const e uma versão não-const.

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

Eu entendo que esta função faz parte de uma classe, pega um índice e verifica se sua lógica, retorna o índice dos dados da matriz na classe. Há também uma função com o mesmo corpo, mas com a chamada de função como

const double &operator[](int idx) const

Por que precisamos de duas versões?

Essa questão de amostra também pode ajudar a elaborar. Qual versão é usada em cada instância abaixo?

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

Minha hipótese de que a versão const só é chamadaa[2] porque não queremos nos arriscar a modificara[0] oua[1].

Obrigado por qualquer ajuda.

questionAnswers(2)

yourAnswerToTheQuestion