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