Справочник Ada 2012
4.7 Квалифицированные выражения
Квалифицированное выражение используется для явного указания типа и проверки подтипа операнда, который представляет собой либо выражение, либо агрегат.
Синтаксис
Правила разрешения имён
Операнд (выражение или агрегат) должен разрешаться как тип, определённый subtype_mark, или универсальный тип, который его охватывает.
Статическая семантика
Если операнд квалифицированного выражения обозначает объект, то квалифицированное выражение обозначает постоянный вид этого объекта. Номинальный подтип квалифицированного выражения — подтип, обозначаемый subtype_mark.
Динамическая семантика
Вычисление квалифицированного выражения вычисляет операнд (и, если это универсальный тип, преобразует его к типу, определённому subtype_mark) и проверяет, что его значение принадлежит подтипу, обозначенному subtype_mark. Если эта проверка не пройдена, возбуждается исключение Constraint_Error. Кроме того, если для подтипа, обозначаемого subtype_mark, включены проверки предикатов, выполняется проверка, как определено в подпункте 3.2.4, «Предикаты подтипов», что значение удовлетворяет предикатам подтипа.
ПРИМЕЧАНИЯ
23 Когда контекст не однозначно определяет ожидаемый тип, можно использовать квалифицированное выражение. В частности, если перегруженное имя или агрегат передаются перегруженной подпрограмме, может потребоваться квалифицировать операнд для разрешения его типа.
Примеры
Примеры разяснения выражений с помощью квалификации:
тип Mask есть (Fix, Dec, Exp, Signif);
тип Code есть (Fix, Cla, Dec, Tnz, Sub);
тип Code есть (Fix, Cla, Dec, Tnz, Sub);
Print (Mask'(Dec)); -- Dec принадлежит типу Mask
Print (Code'(Dec)); -- Dec принадлежит типу Code
Print (Code'(Dec)); -- Dec принадлежит типу Code
для J в Code'(Fix) .. Code'(Dec) цикл ... -- квалификация необходима для Fix или Dec
для J в Code диапазон Fix .. Dec цикл ... -- квалификация не нужна
для J в Code'(Fix) .. Dec цикл ... -- квалификация не нужна для Dec
для J в Code диапазон Fix .. Dec цикл ... -- квалификация не нужна
для J в Code'(Fix) .. Dec цикл ... -- квалификация не нужна для Dec
Dozen'(1 | 3 | 5 | 7 => 2, другие => 0) -- см. 4.6