Выполняется ли поиск, зависящий от аргумента, перед обычным поиском области видимости?

Это рассматриваемый код, который появляется в §13.3 "C++ Primer", 5ed:

void swap(Foo &lhs, Foo &rhs)
{
    using std::swap;
    swap(lhs.h, rhs.h); // uses the HasPtr version of swap
    // swap other members of type Foo
}

В книге упоминается явление, когда специфичный для класса своп не скрывается объявлением using, и отсылается читатель к §18.2.3:

введите здесь описание изображения

Я прочитал этот раздел и понял, что это может быть связано с поиском, зависящим от аргумента (ADL). Ниже приводится выдержка:

введите здесь описание изображения

Но у меня все же есть некоторая неясность в понимании. Мой вопрос: идет ли ADL до обычного поиска области или после обычного поиска области? Мое текущее понимание состоит в том, что ADL предшествует обычному поиску области, потому что в противном случае должен использоваться std::swap. Мне нужно подтверждение, если вы думаете, что я прав, или, пожалуйста, укажите, какую ошибку я совершил, если вы думаете, что я не прав. Спасибо.


person user5280911    schedule 17.10.2017    source источник


Ответы (1)


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

Эти имена функций просматриваются в пространствах имен их аргументов в дополнение к областям действия и пространствам имен, рассматриваемым при обычном поиске неполного имени.

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

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

person songyuanyao    schedule 17.10.2017