c++ - 模板重载加上指向指针的指针

标签 c++ templates constants overloading

我有以下代码:

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/

相关文章:

c++ - 我的复制构造函数有什么问题?

c++ - 将 DLL 调用到 VB.Net 中时出现未处理的 AccessViolationException 错误

c++ - 数组和值的模板声明

c++ - 为什么PIMPL中不能访问实现类的常量函数?

c++ - dynamic_cast 与在父类中公开虚函数 (C++)

c++ - 为什么不能将 vector<bool> 中元素的地址推回 vector<bool*>?

C++ 可链接属性

c++ - 线性链式工厂和 move 语义

c++ - static const char [] 在类线程安全吗?

C++ 通过引用传递以及值和常量问题