Список правил разрешения имен C++ (и перегрузки)
Где я могу найти список правил, которые компилятор, совместимый с C++, должен применять для разрешения имен (включая перегрузку)?
Я хотел бы что-то вроде алгоритма естественного языка или блок-схемы.
Стандарт C++, конечно, имеет этот набор правил, но он создается по мере того, как вводятся новые языковые операторы, и результат довольно трудно запомнить.
Короче говоря, я хотел бы знать полный и подробный ответ на вопрос "Что делает компилятор, когда видит имя" A "?"
Я знаю, что C++ - это "мы делаем это, когда X, а не Y, если Z имеет место", поэтому я спрашиваю, возможно ли сделать его более линейным.
РЕДАКТИРОВАТЬ: я работаю над черновиком этой темы, что может быть коллективно улучшено после публикации. Однако я очень занят в эти дни, и может потребоваться время, чтобы что-то опубликовать. Если кому-то будет интересно, я буду рекламировать "личную заметку о необработанном текстовом файле" и публиковать ее.
1 ответ
Ну, в общих чертах
Если имени предшествует
::
, как в::A
или жеX::A
, затем используйте поиск подходящего имени. Первый взгляд вверхX
, если он существует (если не использовать глобальное пространство имен), то посмотрите в немA
, ЕслиX
это класс, иA
не является непосредственным членом, то посмотрите во всех прямых основахX
, ЕслиA
найдено в более чем одной базе, сбой.В противном случае, если имя используется как вызов функции, такой как
A( X )
, используйте аргумент-зависимый поиск. Это сложная часть. ИщуA
в пространстве имен типX
был объявлен в друзьяхX
, и еслиX
является шаблоном, аналогичным для всех задействованных аргументов. Области, связанные толькоtypedef
не применяются. Сделайте это в дополнение к неквалифицированному поиску.Начните с неквалифицированного поиска, если аргумент-зависимый поиск не применяется. Это обычный способ поиска переменных. Начните с текущей области и продолжайте работать до тех пор, пока имя не будет найдено. Обратите внимание, что это уважает
using namespace
директивы, которых нет в двух других случаях.
Просто взглянув на Стандарт покажет много исключений и ошибок. Например, неквалифицированный поиск используется, чтобы определить , используется ли имя как вызов функции, в отличие от выражения приведения, до того, как ADL будет использован для генерации списка потенциальных перегрузок. Неквалифицированный поиск не ищет объекты во вложенных областях вложенных локальных классов, потому что такие объекты могут не существовать на момент ссылки.
Применяйте здравый смысл и задавайте более конкретные вопросы, когда (как это часто бывает) интуиция терпит неудачу.