Позвольте мне использовать пример ...
class foo {};
int main() {
foo* a;
a+5; // fine ?
a[3]; // fine ?
foo b;
b+5; // error: no operator found
b[3]; // error: no operator found
}
Существуют определенные операторы для указателей (пример не завершен, смысл лишь в том, чтобы продемонстрировать, что они не являются операторами для объектов).Они работают для указателей любого типа.Вы потребляете операции над указателями с операциями над экземплярами.Сравнение указателей - это не то же самое, что сравнение объектов.
Более того, когда a
является указателем, тогда a[b]
это просто *(a+b)
.Следовательно, в вашем коде это работает, но на самом деле это не так.Вы обрабатываете this
, как если бы это был указатель на массив объектов, а затем разыменовываете его в тех местах памяти, где нет Array
объектов (у вас есть только один, а не их массив).На самом деле вы обращаетесь за пределы, и ваш код имеет неопределенное поведение.
Сообщение об ошибке фактически объясняет, что не так:
= не может преобразовать из массива в T
, потому что здесь
temp = this[j];
temp
- это, конечно, T
, тогда как this[j] == *(this + j)
, т.е. вы увеличиваете указатель this
на j
-х sizeof(Array<int,49>)
(вот что происходит, когда вы добавляете целое число к указателю определенного типа) и затем вы разыменовываете указатель, чтобы получить Array<int,49>
.Для этих типов нет оператора присваивания, следовательно, ошибка.
Более того, в этой ячейке памяти нет Array<int,49>
.На самом деле вам повезло получить ошибку компилятора, обычно неопределенное поведение более скрыто, скрывается за невинно выглядящими предупреждениями или, что еще хуже, без предупреждений и кажется работающим, когда его на самом деле нет.