簡體   English   中英

模板化的函數名稱查找難題(ADL)

[英]Templated function name lookup conundrum(ADL)

給定以下代碼,為什么為什么要調用Generic函數而不是更具體的基於SomeClass的函數?

template <typename T>
class SomeClass
{
};

template <typename T>
void foo(T)
{
   std::cout << "foo() Generic - Undesired function\n";
}

template <typename T>
void foo(const SomeClass<T>*)
{
   std::cout << "foo() SomeClass<T> - Desired function\n";
}


int main()
{
   SomeClass<char>* sc = new SomeClass<char>();
   foo(sc);
   return 0;
}

注意:如果要從“ void foo(const SomeClass<T>*) ”定義中刪除const,則會調用所需的函數。 我也嘗試過重新整理foo,盡管它沒有任何影響。 如有可能,請調用標准中描述此特定ADL方案的相關區域。

使用const: http//ideone.com/DIchLl

沒有const: http//ideone.com/Iam4LV

使用const(1st): http//ideone.com/W6PoJw

因為沒有const需要較少的轉換。 當編譯器選擇重載時,它首先查找完全匹配的重載,然后按特定順序進行一系列轉換,找到的第一個是所使用的。

在此示例中, scSomeClass<char>*& 編譯器首先嘗試完全匹配,由於沒有匹配項,因此嘗試刪除& 因為找到了一個,所以它退出查找,並且不添加允許它看到另一個的const

foo(T)T = SomeClass<T>*的參數完全匹配。

foo(const SomeClass<T>*)需要進行資格轉換(以添加const限定符)。

完全匹配比需要任何轉換的匹配要好,即使這只是資格轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM