我有以下代码:
template<class A, class B>
void test(A& a, const B* b)
{ std::cout << "hi" << std::endl; }
template<class A, class B>
void test(A& a, const B** b)
{ std::cout << "hello" << std::endl; }
class TestClass
{};
int main()
{
int a = 5;
TestClass b;
TestClass* c = &b;
test(a, &c);
return 0;
}
虽然看起来更好的匹配是第二个模板函数,但不知何故输出是“hi”。当我删除 const
作为 B*
和 B**
的限定符时,我得到对应于第二个模板函数的“hello”。在这种情况下,编译器如何选择要调用的函数?谢谢!
最佳答案
鉴于没有从 T**
到 T const**
的转换,第二个根本不匹配(没有这样的转换,因为它会允许非const
访问const
对象)。但是,存在从 T**
到 T* const*
的转换。因此,相应的重载是唯一可行和使用的重载。
关于c++ - 模板重载加上指向指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24119117/