Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, jazzer, Вы писали:
J>>предлагаю помедитировать над следующим кодом
J>>J>>typedef int Arr[5];
J>>void f(Arr& x);
J>>int main()
J>>{
J>> int arr5[5];
J>> int arr6[6];
J>> f(arr5);
J>> f(arr6);
J>>};
J>>
LVV>На компиляторе не проверял, но должна быть ошибка трансляции на второй функции.
LVV>Передача массива по ссылке — нормально. Ну и что?
LVV>Имеется ввиду, что выполняется контроль типов и "массив другого типа" компилятор не пропускает.
LVV>К вопросу о полноценности типа массива. Yes?
No.
Твои слова "Имя массива — это адрес его первого элемента" означают, что тип как arr5, так и arr6 — int*, соответственно, ни один вызов не должен скомпилироваться.
Так что суть именно в приведениях типа — я тебе только что продемонстрировал случай, когда оно не происходит и используется явный тип массива.
А когда оба эти массива можно передать в функцию, принимающую указатель на int — здесь как раз происходит приведение типа от массива к указателю.