Похоже, вы спрашиваете конкретно о квалифицированных выражениях (третий маркер Кейта в его ответе).
В Аде, если у вас есть два объекта разных типов, вы можете попытаться преобразовать их между собой, используя тип назначенияимя как имя функции, например так:
Foo: constant Integer: = Integer (2.35);
Обычно это работает, только если оба типа являются числовыми типами или один из производных отother (объявлено как type New_Type is new Old_Type
...).
Компилятору, конечно, придется добавить код, чтобы убедиться, что значение находится в пределах любых ограничений, которые может иметь тип назначения.Но это очень полезно для простых преобразований типов.
Однако, когда вы имеете дело с выражениями, иногда вам нужно не просто преобразование , а, скорее, сообщить компилятору, какой типсделать выражение.Для этого не требуется код времени выполнения, просто сделайте выражение тем типом, который я вам говорю.
Компиляторы обычно могут понять это из контекста, но иногда они не могут.Вот тут-то и появляется этот апостроф. Он говорит компилятору не преобразовывать выражение в указанный тип, а скорее создавать его как этот тип.
Наиболее распространенныйиспользуйте для этого при выполнении динамического распределения, как показано в вашем примере.Иногда могут быть другие ситуации, когда это необходимо.Одним из примеров может быть передача литерального значения в перегруженную подпрограмму.Скажем, у вас есть две версии процедуры My_Routine
, одна из которых принимает Integer
, а другая принимает другой пользовательский целочисленный тип.Если вы передаете объекты в него, компилятор может просто посмотреть на тип объекта.Однако, если вы передадите литерал 1
, скорее всего, вы получите ошибку компилятора из-за неоднозначности выражения.
Вы можете решить эту проблему, поместив ваш литерал 1
в постоянное целое число и передав егов (затем ворча о вашем дурацком компиляторе).Однако проще сделать следующее:
My_Routine (Integer'(1));
Это устраняет неоднозначность для вашего компилятора.Это не «преобразование», поэтому дополнительный код не требуется.Вы просто сообщаете компилятору, что следующее выражение имеет тип Integer
.