类型转换/提升不明确
Unclear type conversion/promotion
下面的代码编译并运行时没有警告。我不清楚在对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
如下所示:
因此,由于构造函数,有一个从单参数构造函数:允许从初始化对象的特定类型。
PA
到B
的隐式转换选项:
B(PA pa)
所以当你打电话时:
func(pA)
将pA
指针转换为B
对象,然后由func
使用
(类似SO post)
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 类型转换问题:返回为整数而不是浮点/类型
- 为什么在类型转换的 nullptr 上不发生隐式转换
- 尽管显式声明了返回类型,但对lambda的调用是不明确的
- 是否删除导致不明确过载的转换
- 为什么这个涉及重载运算符和隐式转换的C++表达式是不明确的
- 模板转换运算符的分辨率不明确
- C++ 函数重载不明确,没有自动类型转换
- 继承会导致不明确的转换
- 为什么我的代码不使用类型转换进行编译?
- 为什么这个函数重载与参数类型转换不明确
- 通过不明确的转换运算符进行引用绑定
- 为什么编译器不执行类型转换?
- 类型转换/提升不明确
- 可转换的类型和不明确的调用
- 错误:不明确的默认类型转换(c++)