2017-02-22 93 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。

相關規則使用C++ 14 3.4.2 [basic.lookup.argdep]。引用N4140,粗體強調礦:

3讓X是由不合格查找(3.4.1)中產生的查找組和讓ÿ是由 參數依賴查找產生的查找集(定義如下)。如果X包含

  • 類成員的聲明,或
  • 一個塊範圍函數聲明爲不是使用聲明,或
  • 聲明既不是功能或功能template

then Y爲空。否則是在與參數類型 參數類型關聯的名稱空間中找到的一組聲明,如下所述。 通過查找名稱找到的一組聲明是 XY的並集。