Справочник Ada 95
13.9 Непроверенные преобразования типов
Непроверенное преобразование типов может быть выполнено вызовом экземпляра обобщенной функции Unchecked_Conversion.
Статическая семантика
Существует следующая определяемая языком обобщенная библиотечная функция:
generic
type Source(<>) is limited private;
type Target(<>) is limited private;
function Ada.Unchecked_Conversion(S : Source) return Target;
pragma Convention(Intrinsic, Ada.Unchecked_Conversion);
pragma Pure(Ada.Unchecked_Conversion);
type Source(<>) is limited private;
type Target(<>) is limited private;
function Ada.Unchecked_Conversion(S : Source) return Target;
pragma Convention(Intrinsic, Ada.Unchecked_Conversion);
pragma Pure(Ada.Unchecked_Conversion);
Динамическая семантика
Размер формального параметра S в экземпляре Unchecked_Conversion соответствует размеру его подтипа. Это фактический подтип, переданный в Source, за исключением случаев, когда фактический параметр является не ограниченным составным подтипом, в этом случае подтип ограничен границами или дискриминантами значения фактического выражения, переданного в S.
Если выполняются все следующие условия, эффект непроверенного преобразования заключается в возвращении значения объекта целевого подтипа, представление которого идентично представлению исходного объекта S:
- S'Size = Target'Size.
- S'Alignment = Target'Alignment.
- Целевой подтип не является не ограниченным составным подтипом.
- S и целевой подтип оба имеют непрерывное представление.
- Представление S является представлением объекта целевого подтипа.
В противном случае, эффект определяется реализацией; в частности, результат может быть аномальным (см. 13.9.1).
Разрешения реализации
Реализация может вернуть результат непроверенного преобразования по ссылке, если тип Source не является типом по копированию. В этом случае результат непроверенного преобразования представляет собой просто другой (только для чтения) вид операнда преобразования.
Реализация может наложить ограничения на Unchecked_Conversion.
Рекомендации по реализации
Размер объекта массива не должен включать его границы; следовательно, границы не должны быть частью преобразуемых данных.
Реализация не должна генерировать ненужные проверки во время выполнения для обеспечения того, что представление S является представлением целевого типа. Она должна использовать разрешение возвращать по ссылке, когда это возможно. Ограничения на непроверенные преобразования следует избегать, если они не требуются целевой средой.
Рекомендуемый уровень поддержки непроверенных преобразований:
- Непроверенные преобразования должны поддерживаться и быть обратимыми в тех случаях, когда этот пункт определяет результат. Для обеспечения осмысленного использования непроверенного преобразования следует использовать непрерывное представление для элементарных подтипов, для статически ограниченных подтипов массивов, подтип элементов которых является одним из подтипов, описанных в этом абзаце, и для подтипов записей без дискриминантов, подтипы элементов которых описаны в этом абзаце.