Что означает примечание 1 в правилах поиска имени члена класса C++?

Из http://eel.is/c++draft/class.member.lookup#1 :

Поиск в области для имени из точки программы P представляет собой единый поиск в течение от пока не это область действия класса или шаблона класса , и в этом случае следующие шаги определяют результат поиска.

[ Примечание 1 : результат отличается только в том случае, если это идентификатор-функции-преобразования или если один поиск ничего не нашел. - конец примечания]

Мне трудно разобраться в этой записке. Кажется, что «единичный поиск» из области видимости класса найдет предыдущие объявления в области видимости пространства имен, поскольку область видимости пространства имен содержит область видимости класса. Но, как мы знаем, если имя также было объявлено как член независимого базового класса, тогда член базового класса имеет приоритет над членом пространства имен.Примечание 1, кажется, противоречит этому, поскольку в нем говорится: «если не является идентификатором-функции-преобразования, то вы можете просто выполнить обычный одиночный поиск, и только если вы ничего не найдете, используйте процедуру из этого раздела ». Но единственный поиск будет успешным, если будет найдено объявление области пространства имен и поиск члена класса даст другой результат.

В чем ошибка моего понимания?

2 ответа

Решение

Отвечать

Единый поиск учитывает только один область видимости, не является пространством имен вшита или даже базовый класс. Это неквалифицированный поиск, который учитывает все охватывающие области. Одиночный поиск и (простой) поиск являются подпрограммами этих процедур более высокого уровня.

Контекст

Следует сказать, что, поскольку в последнее время возникло много этих вопросов, эти термины существуют для уменьшения двусмысленности и неточности ( например , проблема 191 CWG) в определениях конструкций «уровня программиста», таких как поиск (не) квалифицированного имени. Я изобретал их не для того, чтобы увеличить количество словарных слов, которые типичный программист должен запомнить. (Другими словами, стандарт - это не учебное пособие.)

Конечно, в этом конкретном вопросе нет ничего особенного в этом отношении, но я должен надеяться, что это поможет найти людей, которым нужно это увидеть.

Цель «единичного поиска» используется для определения того, как поиск должен выполняться для члена. Проще говоря, если для поиска члена в области пространства имен используется один поиск, его охватывающая область не будет найдена из-за единственного поиска здесь, если объявление еще не найдено.

В соответствии с правилом, которое вы здесь процитировали, область действия класса или шаблона класса является здесь исключением из «единого поиска», что означает, что одиночный поиск должен продолжаться в его базовых классах, если ничего еще не найдено.

Набор объявлений является результатом единственного поиска в области C для N сразу после спецификатора класса C, если P находится в контексте полного класса C, или из P в противном случае.

Это рекурсивная процедура. Следовательно, в примечании говорится: «Результат будет отличаться только в том случае, если при однократном поиске ничего не будет найдено».

В то время как для «Результат отличается, только если N является идентификатором-функции-преобразования» из-за следующего правила:

В каждом случае, когда функции преобразования класса S рассматриваются для инициализации объекта или ссылки типа T, функции-кандидаты включают в себя результат поиска оператора идентификатора функции преобразования T в S.

Это не означает, что имя «оператор Т» является уникальным именем для поиска функции преобразования, «допустимые типы» также являются кандидатами для поиска согласно соответствующему правилу.

Каждый такой случай также определяет наборы допустимых типов для явных и неявных функций преобразования;

В любом случае, примечание используется для обозначения исключения для «одиночного поиска», который не должен был найти никаких деклараций при единственном поиске, но другие возможные способы их найдут.

Другие вопросы по тегам