模板重载加上指针到指针
template overloading plus pointer to pointer
我有以下代码:
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
是一个TestClass**
,可以升级为TestClass* const *
,但不能升级为const TestClass**
。
您可以通过显式使用test<int, TestClass>(a, &c);
来强制执行错误,这将向您显示不可能的转换。
其他答案正确地指出,从T**
到const T**
没有隐式转换,因此其中一个重载根本不可行。我将解释为什么不允许这种转换。它实际上是作为一个例子写在标准中的。引用第4.4段
[注意:如果程序可以将T**类型的指针分配给指针类型为const T**(即,如果允许下面的第1行(的程序可能会无意中修改const对象(就像在第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
}
相关文章:
- C++指针复制重载
- 如何在基类指针向量的元素上应用重载的多态函数
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- 使用继承的指针列表复制构造函数或重载运算符=
- 为指针重载运算符++
- 如何从模板类重载创建的指针对象上的运算符?
- 用指针重载运算符+
- 函数指针重载函数
- 函数指针重载错误
- 矢量可以包含一个智能指针,该指针重载运算符&?
- 模板函数指针重载
- C++:使用函数指针重载<<运算符
- 将nullptr参数委托给模板代码中的指针重载
- 用模板和指针重载数组操作符
- STL优先级队列和指针重载