自动转换为引用

Automatic Cast to Reference?

本文关键字:引用 转换      更新时间:2023-10-16

我有以下代码:

#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函数匹配,这是第一个。