类型转换/提升不明确

Unclear type conversion/promotion

本文关键字:不明确 类型转换      更新时间:2023-10-16

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

从类型"PA{又称A*}"的表达式中初始化类型"const B&"引用无效

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

#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

如下所示:

单参数构造函数:允许从初始化对象的特定类型。

因此,由于构造函数,有一个从PAB的隐式转换选项:
    B(PA pa)

所以当你打电话时:

    func(pA)

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

(类似SO post)