2

鉴于以下代码,为什么调用 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 场景的相关区域。

带常量:http: //ideone.com/DIchLl

没有常量:http: //ideone.com/Iam4LV

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

4

2 回答 2

2

因为没有的const需要更少的转换。当编译器选择重载时,它首先查找完全匹配的,然后按特定顺序进行一系列转换,找到的第一个就是使用的那个。

在此示例中,scSomeClass<char>*&. 编译器首先尝试完全匹配,因为没有,它会尝试删除&. 因为它找到了一个,所以它停止查找,并且不添加const允许它看到另一个的。

于 2013-01-21T02:46:54.363 回答
2

foo(T)T=的参数完全匹配SomeClass<T>*

foo(const SomeClass<T>*)需要资格转换(添加const限定符)。

精确匹配优于需要任何类型转换的匹配,即使它只是限定转换。

于 2013-01-21T02:47:24.887 回答