Spec-Zone.ru › Ada 95
Справочник Ada 95

8.6 Контекст разрешения перегрузки

Поскольку объявления могут быть перегружены, возможно, что имя использования имеет более одного возможного толкования; в большинстве случаев неоднозначность запрещена. Этот пункт описывает, как возможные толкования разрешаются в фактическое толкование.
Определенные правила языка (Правила разрешения имен) считаются «правилами перегрузки». Если возможное толкование нарушает правило перегрузки, предполагается, что оно не является предполагаемым толкованием; предполагается, что другое возможное толкование является фактическим толкованием. С другой стороны, нарушения правил, не являющихся правилами перегрузки, не влияют на выбор толкования; вместо этого они приводят к тому, что конструкция является незаконной. Для законности обычно должно быть ровно одно приемлемое толкование конструкции, являющейся «полным контекстом», не считая вложенных полных контекстов.
Правила синтаксиса языка и правила видимости, приведенные в 8.3, определяют возможные толкования. Большинство правил проверки типов (правила, требующие определенного типа или определенного класса типов, например) являются правилами перегрузки. Различные правила сопоставления формальных и фактических параметров являются правилами перегрузки.

Правила разрешения имен

Разрешение перегрузки применяется отдельно к каждому полному контексту, не учитывая внутренние полные контексты. Каждая из следующих конструкций является полным контекстом:
  • Элемент context_item.
  • Элемент declarative_item или объявление.
  • Утверждение statement.
  • Ассоциация аргумента pragma_argument_association.
  • Выражение expression оператора case_statement.
(Общее) толкование полного контекста воплощает его смысл и включает следующую информацию о составляющих полного контекста, не включая составляющие вложенных полных контекстов:
  • для каждой составляющей полного контекста, к каким синтаксическим категориям она принадлежит и по каким синтаксическим правилам; и
  • для каждого имени использования, какое объявление оно обозначает (и, следовательно, какой вид и какая сущность оно обозначает); и
  • для полного контекста, являющегося declarative_item, является ли он завершением объявления и (если да), какое объявление он завершает.
Возможным толкованием является толкование, которое подчиняется правилам синтаксиса и правилам видимости. Приемлемым толкованием является возможное толкование, которое подчиняется правилам перегрузки, то есть правилам, которые определяют ожидаемый тип или ожидаемый профиль или определяют, как конструкция должна разрешаться или толковаться.
Толкование составляющей полного контекста определяется из общего толкования полного контекста в целом. Таким образом, например, «интерпретируется как function_call» означает, что толкование конструкции говорит о том, что она принадлежит к синтаксической категории function_call.
Каждое вхождение имени использования обозначает объявление, определяемое его толкованием. Оно также обозначает вид, объявленный его обозначенным объявлением, за исключением следующих случаев:
  • Если имя использования появляется внутри области объявления type_declaration и обозначает то же самое объявление type_declaration, то оно обозначает текущий экземпляр типа (а не сам тип). Текущий экземпляр типа — это объект или значение типа, связанный с выполнением, которое оценивает имя использования.
  • Если имя использования появляется внутри области объявления generic_declaration (но не внутри его generic_formal_part) и оно обозначает то же самое объявление generic_declaration, то оно обозначает текущий экземпляр генерируемого блока (а не сам генерируемый блок). См. также 12.3.
Имя использования, обозначающее вид, также обозначает сущность этого вида.
Ожидаемый тип для данного выражения expression, name или другой конструкции определяет, согласно правилам разрешения типов, приведенным ниже, типы, рассматриваемые для конструкции во время разрешения перегрузки. Правила разрешения типов поддерживают программирование на основе классов, универсальные числовые литералы, операции диспетчеризации и анонимные типы доступа:
  • Если от конструкции ожидается любой тип в классе типов или универсальный или общеклассовый тип для класса, то тип конструкции должен разрешиться в тип в этом классе или в универсальный тип, покрывающий класс.
  • Если ожидаемый тип для конструкции — конкретный тип T, то тип конструкции должен разрешиться либо в T, либо:
  • в T'Class; или
  • в универсальный тип, который покрывает T; или
  • если T — анонимный тип доступа (см. 3.10) с указанным типом D, в тип доступа к переменной, указанный тип которого — D'Class или покрывается D.
В некоторых контекстах, таких как в объявлении переименования подпрограммы subprogram_renaming_declaration, правила разрешения имен определяют ожидаемый профиль для данного имени name; в таких случаях имя name должно разрешаться в имя вызываемой сущности, профиль которой соответствует ожидаемому профилю.

Правила допустимости

Когда ожидаемый тип конструкции должен быть единственным типом в данном классе, ожидаемый тип конструкции должен быть определяемым только из контекста, в котором появляется конструкция, исключая саму конструкцию, но используя требование, чтобы она была в данном классе; тип конструкции затем является этим единственным ожидаемым типом. Кроме того, контекст не должен ожидать любой тип в некотором классе, который содержит типы данного класса; в частности, конструкция не должна быть операндом преобразования типа type_conversion.
Полный контекст должен иметь по крайней мере одно приемлемое толкование; если их ровно одно, то выбирается это одно.
Предпочтение отдается префиксным операторам (и range) корневых числовых типов root_integer и root_real. В частности, если два приемлемых толкования составляющей полного контекста отличаются только тем, что одно — для префиксного оператора (или range) типа root_integer или root_real, а другое — нет, то толкование с использованием префиксного оператора (или range) корневого числового типа является предпочтительным.
Для полного контекста, если существует ровно одно общее приемлемое толкование, где толкование каждой составляющей такое же или предпочтительнее (в указанном выше смысле) по сравнению с теми в остальных общих приемлемых толкованиях, то это общее приемлемое толкование выбирается. В противном случае, полный контекст является неоднозначным.
Полный контекст, отличный от pragma_argument_association, не должен быть неоднозначным.
Полный контекст, который является pragma_argument_association, может быть неоднозначным (если не указано иное для данного псевдокоманды), но только в том случае, если каждое приемлемое толкование аргумента псевдокоманды является именем name, которое статически обозначает вызываемую сущность. Такое имя name обозначает все объявления, определяемые его толкованиями, и все виды, объявленные этими объявлениями.
ПРИМЕЧАНИЯ
16 Если у имени использования есть только одно приемлемое толкование, то оно обозначает соответствующую сущность. Однако это не означает, что имя использования обязательно законно, поскольку существуют другие требования, которые не рассматриваются для разрешения перегрузки; например, тот факт, что выражение является статическим, является ли объект постоянным, правила соответствия режимов и подтипов, правила заморозки, порядок разработки и так далее.
Аналогично, подтипы не рассматриваются для разрешения перегрузки (нарушение ограничения не делает программу незаконной, но вызывает исключение во время выполнения программы).


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API