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

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, то оно обозначает текущую инстанцию типа (а не сам тип); текущая инстанция типа — это объект или значение типа, связанное с выполнением, которое оценивает ссылку на имя. Это правило не применяется, если ссылка на имя появляется внутри subtype_mark определения access_definition для типа доступа к объекту или внутри подтипа параметра или результата типа доступа к подпрограмме.
  • Если ссылка на имя появляется в области объявления generic_declaration (но не в его части generic_formal_part) и обозначает то же самое объявление generic_declaration, то оно обозначает текущую инстанцию генерируемого блока (а не сам генерируемый блок). См. также 12.3.
Ссылка на имя, обозначающая вид, также обозначает сущность этого вида.
Ожидаемый тип для данного выражения expression, имени name или другой конструкции определяет, согласно правилам разрешения типов, описанным ниже, типы, рассматриваемые для конструкции при разрешении перегрузки. Правила разрешения типов поддерживают программирование с классами, универсальные литералы, диспетчеризацию операций и анонимные типы доступа:
  • Если от конструкции ожидается любой тип из класса типов или универсальный или класс-типовой тип для класса, то тип конструкции должен разрешиться в тип из этого класса или в универсальный тип, охватывающий класс.
  • Если ожидаемый тип для конструкции — конкретный тип T, то тип конструкции должен разрешиться либо в T, либо:
  • в T'Class;
  • в универсальный тип, охватывающий T;
  • в случае, когда T — конкретный анонимный тип доступа к объекту (см. 3.10) с обозначенным типом D, в тип доступа к объекту, обозначенный тип которого — D'Class или охватываемый D;
  • в случае, когда T — анонимный тип доступа к подпрограмме (см. 3.10), в тип доступа к подпрограмме, профиль которого совместим с профилем T.
В определённых контекстах, таких как в объявлении переименования подпрограммы 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 обозначает все объявления, определяемые его толкованиями, и все виды, объявляемые этими объявлениями.
ПРИМЕЧАНИЯ
17 Если ссылка на имя имеет только одно приемлемое толкование, то оно обозначает соответствующую сущность. Однако это не означает, что ссылка на имя обязательно корректна, поскольку существуют и другие требования, которые не учитываются при разрешении перегрузки; например, факт того, что выражение статично, является ли объект константой, правила соответствия режимам и подтипам, правила заморозки, порядок выработки и так далее.
Аналогично, подтипы не учитываются при разрешении перегрузки (нарушение ограничения не делает программу незаконной, но вызывает исключение во время выполнения программы).


Spec-Zone.ru

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