Список правил разрешения имен (и перегрузки) С++ - программирование
Подтвердить что ты не робот

Список правил разрешения имен (и перегрузки) С++

Где я могу найти список правил, которые должен применять компилятор, совместимый с С++, для выполнения разрешения имен (включая перегрузку)?

Мне бы хотелось что-то вроде алгоритма или блок-схемы на естественном языке.

Стандарт С++, конечно, имеет этот набор правил, но он создается, когда вводятся новые инструкции языка, и результат довольно трудно запомнить.

Короче говоря, я хотел бы получить полный и подробный ответ на вопрос "Что делает компилятор, когда он видит имя" A "?

Я знаю, что С++ - это все: "Мы делаем это, когда X, но не Y, если Z держится", поэтому я спрашиваю, возможно ли сделать его более линейным.

РЕДАКТИРОВАТЬ. Я работаю над проектом этой темы, что может быть улучшено коллективно после публикации. Однако я очень занят в эти дни, и может потребоваться время, чтобы иметь что-то публичное. Если кто-то заинтересован, я буду продвигать "личную заметку на необработанном txt файле" на что-то лучшее и опубликовать его.

4b9b3361

Ответ 1

Ну, с широкими штрихами:

  • Если имени предшествует ::, как в ::A или X::A, затем используйте квалифицированный поиск имени. Сначала найдите X, если он существует (если не использовать глобальное пространство имен), посмотрите в него A. Если X - класс, а A не является прямым членом, тогда просмотрите все прямые базы X. Если A найдено более чем в одной базе, выполните сбой.

  • В противном случае, если имя используется как вызов функции, такой как A( X ), используйте зависящий от аргумента поиск. Это трудная часть. Ищите A в пространстве имен, в котором был объявлен тип X, в друзьях X, и если X - это экземпляр шаблона, аналогично для всех аргументов. Области, связанные только с typedef, не применяются. Сделайте это в дополнение к неквалифицированному поиску.

  • Начните с неквалифицированного поиска, если поиск, зависящий от аргументов, не применяется. Это обычный способ нахождения переменных. Начните с текущей области и начните работу до тех пор, пока имя не будет найдено. Обратите внимание, что это относится к директивам using namespace, которые не существуют в других двух случаях.

Просто взглянув на Стандарт, вы увидите множество исключений и ошибок. Например, неквалифицированный поиск используется для определения того, используется ли имя как вызов функции, а не выражение-литье, до того как ADL используется для создания списка потенциальных перегрузок. Неквалифицированный поиск не ищет объекты в окружении областей вложенных локальных классов, поскольку такие объекты могут отсутствовать во время ссылки.

Применяйте здравый смысл и задавайте более конкретные вопросы, когда (как это часто бывает) интуиция терпит неудачу.