[英]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
需要較少的轉換。 當編譯器選擇重載時,它首先查找完全匹配的重載,然后按特定順序進行一系列轉換,找到的第一個是所使用的。
在此示例中, sc
是SomeClass<char>*&
。 編譯器首先嘗試完全匹配,由於沒有匹配項,因此嘗試刪除&
。 因為找到了一個,所以它退出查找,並且不添加允許它看到另一個的const
。
foo(T)
與T
= SomeClass<T>*
的參數完全匹配。
foo(const SomeClass<T>*)
需要進行資格轉換(以添加const
限定符)。
完全匹配比需要任何轉換的匹配要好,即使這只是資格轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.