自动转换为引用
Automatic Cast to Reference?
我有以下代码:
#include <iostream>
template<typename T>
void gaga(T * a){
std::cout << "gaga(T * a)";
}
template<typename T> class A{};
template<typename T>
void gaga(A<T> & a){
std::cout << "gaga(A<T> & a)n";
}
template<typename T>
class B {
public:
T * p;
operator T*() const{
std::cout << "Cast called" <<std::endl;
return p;
}
};
int main()
{
B< A<int> > b;
gaga(*b); /// WHAT IS GOING ON HERE? WHY is void gaga(A<T> & a) CALLED?
A<int> * p;
gaga(p); /// WHEN THE ABOVE calls void gaga(A<T> & a) WHY is here
/// void gaga(T * a) CALLED???
}
我真的很困惑为什么当我用*b
调用gaga(A<T> & a)
时调用它,这显然是由A<T> *
中的转换运算符产生的,但为什么??--> *b
是一个解引用运算符甚至没有定义!??为什么可以交给gaga(A<T> & a)
呢?
谢谢你的解释!
好吧,b是类型为B b可以转换为T*,因为您添加了转换操作符,这意味着它可以转换为A*。
调用解引用操作符时,您看到*b变成了A,因此很明显调用了第二个gaga,因为它有一个引用作为形参。
在第二种情况下,它甚至更明显。你有一个指向a的指针,它将与唯一一个以指针作为参数的gaga函数匹配,这是第一个。
相关文章:
- 强制转换为引用类型
- 如何将 int 引用安全地转换为长引用?
- 右值引用转换后的地址更改
- C++将引用转换为指针?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 将常量引用转换为智能指针而不复制
- 为什么不能将继承自(非模板)类 B 的实例化类模板 A 的引用转换为对 B 的引用?
- 通过 see 命令引用转换运算符
- 将项目转换为 qt5 并将未定义的引用转换为 'vtable for qt5 和 cmake
- 从 r 值引用转换为 l 值引用,为什么有效
- C++从右值引用转换为右值引用 a unique_ptr
- 将引用转换为 C++ 中的指针表示形式
- 如何正确地将引用转换为指针
- 正在将常量结构引用转换为非常量指针
- 将传递引用转换为传递返回
- 将.net引用转换为c++引用
- c++向量引用转换
- 如何将对int8_t的引用转换为对uint8_t的引用
- 如何在c++中将数字字符引用转换为Unicode
- 是否可以将对 std::list<int*> 的引用转换为对 std::list<const int*> 的引用?