C++ 模板重载加上指向指针的指针

C++ 模板重载加上指向指针的指针,c++,templates,constants,overloading,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 Test

我有以下代码:

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;
}
模板
无效测试(A&A,常数B*B)

{std::cout假设没有从
T**
T const**
的转换,第二个根本就不匹配(没有这种转换,因为它将允许非
const
访问
const
对象)但是,有一个从
T**
T*const*
的转换。因此,相应的重载是唯一可行且使用的重载。

是一个
TestClass**
可以升级为
TestClass*const*
,但不能升级为
const TestClass**


您可以通过显式使用
test(a,&c)强制执行错误
这将显示不可能的转换。

其他答案正确地指出,从
T**
const T**
没有隐式转换,因此其中一个重载根本不可行。我将解释为什么不允许这种转换。它实际上是作为标准中的一个示例编写的。引用第4.4段

[注:如果程序可以将T**类型的指针分配给指针 类型为const T**(即,如果允许下面的第1行),程序 可能无意中修改常量对象(如第#2行所做)。 比如说,

int main() {
    const char c = ’c’;
    char* pc;
    const char** pcc = &pc; // #1: not allowed
    *pcc = &c;
    *pc = ’C’; // #2: modifies a const object
}