2017-02-22 56 views
2

Если функция не может быть найдена в области, в которой она вызывается, будет выполняться поиск в пространствах имен его аргументов. У меня есть несколько вопросов.поиск функций и пространства имен

  1. Если в разных пространствах имен есть несколько аргументов, какое пространство имен будет сначала просмотрено? Является ли это пространством имен первого аргумента?

    f(A::T t, B:U u); // Is namespace A looked up first? 
    
  2. Более сложные для шаблонных классов, как

    f(A::T<B::U> t); // Namespace A or B is looked up first? 
    

ответ

5

На самом деле, нет никакого порядка среди пространств имен для ADL. Все соответствующие пространства имен просматриваются, и все найденные функции образуют набор кандидатов для разрешения перегрузки.

Также обратите внимание, что в отличие от того, что вы говорите в вопросе, ADL выполняется, даже если функция равна, найденной по неквалифицированному поиску в области вызова. Объединение неквалифицированного поиска и ADL затем используется для поиска лучшей перегрузки.

ADL подавляется только в том случае, если неквалифицированный поиск в области вызовов находит член класса, нефункцио- нальную или неинформационную область, а не using.

Соответствующие правила приведены в C++ 14 3.4.2 [basic.lookup.argdep]. Цитирование N4140, жирный курсив мой:

-Пусть Х быть поиск производится множество неквалифицированного поиска (3.4.1) и пусть У быть поиск производится множество аргумента зависимого поиска (определяются следующим образом). Если Х содержит

  • декларацию члена класса или
  • объявление функции блока-сферы, которая не является использованием декларация, или
  • декларацию, которая не является ни функция или функция шаблон

then Y пусто. В противном случае Y - это набор деклараций, найденных в пространствах имен, связанных с типами аргументов , как описано ниже. Набор объявлений, найденных при поиске имени, представляет собой объединение X и Y.