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

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

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

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

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

Правила законности

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


Spec-Zone.ru

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