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