自动演员参考?

时间:2014-06-13 18:27:21

标签: c++ templates casting

我有以下代码:

#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???
}

我真的很困惑为什么gaga(A<T> & a)在我用*b调用时会被调用,这显然是由A<T> *中的转换运算符引起的,但为什么呢? ---&GT; *b是一个甚至没有定义的解引用运算符!??为什么甚至可以交给gaga(A<T> & a)

感谢您的解释!

1 个答案:

答案 0 :(得分:2)

嗯,b是B型中的一个&lt; A&gt; b可以转换为T *,因为你添加了转换运算符,这意味着它可以转换为A *。

当调用dereference运算符时,你会看到* b变为A,所以很明显第二个gaga被调用,因为它有一个引用作为参数。

在第二种情况下,它更加明显。你有一个指向A的指针,它将与唯一一个以指针作为参数的gaga函数匹配,第一个。

相关问题