Экземпляр Unchecked_Conversion
копирует байты исходного значения в цель, не проверяя, является ли это разумным. Некоторые компиляторы предупреждают (возможно, в зависимости от параметров компиляции), если значения имеют разные размеры.
Element3_Range
и Element4_Range
оба основаны на Integer
и будут использовать одинаковое количество байтов; поэтому обеим переменным вашего массива (Myarr3
, Myarr4
) потребуется одинаковое количество байтов (обычно 40).
Вы могли бы написать
Myarr3 := To_Myarr3 (Myarr4);
В нынешнем виде ничего плохого не произойдет, потому что все значения, которые вы использовали для инициализации Myarr4
, допустимы как значения Element3_Range
.
Однако, если у вас было
Myarr3 := To_Myarr3 (Myarr4'(1, 2, 3, 4, others => 1));
В результате вы получите Myarr3(4)
, содержащее значение вне допустимого диапазона Element3_Range
, и у компилятора нет оснований полагать, что оно может быть недействительным. Это может привести к Constraint_Error
s по линии.
Вы можете самостоятельно выполнить проверку:
if not Myarr3 (4)'Valid then
-- handle the error case