不清楚类型转换/促销

时间:2016-08-10 12:33:07

标签: c++

以下代码编译并在没有警告的情况下运行。 我不清楚调用func时会发生什么样的转换。该函数需要引用类型B,但它接受指向类型A的指针。删除构造函数B(PA A)时,编译失败,声称无法初始化引用类型:

  

“const B&”类型引用的初始化无效来自'PA {aka A *}'

类型的表达

我不明白为什么首先调用构造函数而不是编译失败。对此有何解释?

#include <iostream>

typedef struct A
{
    int x;
    int y;
} *PA;

class B
{
    public:
        B(PA pa):m_pa(pa){}
        int getPa() const{return m_pa->x;}
    private:
        PA m_pa;
};

void func(const B& b)
{
    std::cout << b.getPa();
}

int main()
{
    A a = {5,7};
    PA pA = &a;

    func(pA);       //Why does this compile and what is the outcome??
    return 0;
}

直播:https://ideone.com/y8Z2O9

1 个答案:

答案 0 :(得分:0)

正如here所说:

  

单参数构造函数:允许从a进行隐式转换   用于初始化对象的特定类型。

因此,由于构造函数,从PAB存在隐式转换选项:

    B(PA pa)

所以当你打电话时:

    func(pA)

pA指针转换为B对象,然后由func使用

(类似SO post