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
}