Войти
ФлеймФорумПрограммирование

Преобразование ссылок на массив [KRESTOPROBLEMY]

Страницы: 1 2 37 8 Следующая »
#0
18:44, 28 мар. 2018
void f( const int (&x)[100] ){}

int main()
{
  int x[100], y[120];
  f(x);
  f(y);
}
Получаем:
|7|error: invalid initialization of reference of type 'const int (&)[100]' from expression of type 'int [120]'

Как так то? Отчего нельзя так просто преобразовать ссылку на больший массив в ссылку на меньший массив?


#1
18:54, 28 мар. 2018

Так вроде логично, функций ожидает на входе массив большего размера.

#2
18:57, 28 мар. 2018

const

#3
18:57, 28 мар. 2018

nes
> Так вроде логично, функций ожидает на входе массив большего размера.
Исправил.
С массивом большего размера тоже ругается.

#4
19:03, 28 мар. 2018

Так вроде логично, функций ожидает на входе массив меньшего размера.

#5
19:10, 28 мар. 2018

ИПавлов
> const
нет.

beejah
> Так вроде логично, функций ожидает на входе массив меньшего размера.
А разве массив на 120 элементов не включает в себя массив на 100 элементов?

#6
19:22, 28 мар. 2018

Panzerschrek[CN]
> А разве массив на 120 элементов не включает в себя массив на 100 элементов?
У тебя функция, которая принимает аргумент типа int[100], будет отрабатывать исходя именно из этого типа (иначе на хер бы тебе этот тип был бы нужен - пойнтер + сайз, и вперед). Например, подготавливать буфер для копирования содержимого исходного массива. Который int[120]. И который тупо по sizeof этот буфер пробьет.

Грубо говоря, int[2] - это struct a { int i0, i1;}, int[3] - это struct b { int i0, i1, i2; };
Никакого автокаста тут быть не может и не должно.

#7
19:27, 28 мар. 2018

beejah
А почему деривед* к басе* кастуется нормально?
Чем отношения между интх100ъ и интх120ъ отличаются от отношения между деривед и басе?

#8
19:39, 28 мар. 2018

1 frag / 2 deaths
> А почему деривед* к басе* кастуется нормально?
Потому что через виртуальные функции предполагается, что будут правильно разрулены все ситуации когда производный тип требует иного поведения. И скармливание деривед* в бейз* без виртуального деструктора является хрестоматийным примером ошибочного кода.
В случае же с массивами, например, хвостик может оказаться неинициализирован и это в дальнейшем приведет к ошибке.

#9
19:53, 28 мар. 2018

1 frag / 2 deaths
> А почему деривед* к басе* кастуется нормально?
Потому что они для этого и сделаны. Чтобы кастоватся нормально.

> Чем отношения между интх100ъ и интх120ъ отличаются от отношения между деривед и
> басе?
Тем, что в Ц одно есть, а другого - нет. Например.

#10
19:53, 28 мар. 2018

Panzerschrek[CN]
> Отчего нельзя так просто преобразовать ссылку на больший массив в ссылку на
> меньший массив?

попробуйте в отверстие диаметром 100 у.е запихнуть трубу диаметром 120 у.е


зы:
тема - бред.

#11
19:56, 28 мар. 2018

Kartonagnick
> попробуйте в отверстие диаметром 100 у.е запихнуть трубу диаметром 120 у.е
Оно и наоборот, говорят, не кастуется. С трубами прокатило бы.

#12
20:09, 28 мар. 2018

beejah
> Оно и наоборот, говорят, не кастуется. С трубами прокатило бы.
труба которая свободно болтается, как г. в прорубе?
насчет прокатило бы - ет вы конечн погорячились.

#13
20:10, 28 мар. 2018

Kartonagnick
Про то и речь.

#14
20:17, 28 мар. 2018

Kartonagnick
> попробуйте в отверстие диаметром 100 у.е запихнуть трубу диаметром 120 у.е
Поэтому нельзя деривед передавать туда, где ожидается басе?

Страницы: 1 2 37 8 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.