C ++ - оператор перегрузки []

У меня есть шаблон класса Array:

template <class T=int, int SIZE=10>
class Array {
    T TheArray[SIZE];
public:
    void Initialize() {
        for (int idx=0; idx < SIZE; idx++) {
            TheArray[idx] = T();
        }
    }

    T& operator [](int idx) {
        return TheArray[idx];
    }

    T operator [](int idx) const {
        return TheArray[idx];
    }
}

У меня есть несколько вопросов по оператору[] перегрузка (я нашел этот пример в сети).

Я это понимаюT& operator [](int idx) возвращает ссылку на значение массива с индексомidx и этоT operator [](int idx) const возвращает свое значение. Тем не менее, я не уверен, в каком случае ссылка или значение будет возвращено с помощью[] оператор.

Кроме того, если я изменюT operator [](int idx) const ->T operator [](int idx)Компилятор жалуется. Это почему? Я могу понять, что компилятор жалуется, потому что отличается только тип возвращаемого значения, но почему он не жалуется, когдаconst добавлен? Это означает только то, что не внутренние классы изменены, верно?

Я попытался отладить эту маленькую основную реализацию:

int main() {
    int val;
    Array<> intArray;

    intArray.Initialize();
    val = intArray[1];
    printf("%d", intArray[1]);
    intArray[1] = 5;
}

И каждый разT& operator [](int idx) называется. Зачем?

Заранее спасибо.

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

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