Static_cast拒绝强制转换指向类的指针,即使定义了用户定义的转换运算符也是如此

Static_cast refuses to cast pointers to a class even with user defined conversion operator defined

本文关键字:定义 转换 用户 运算符 指针 拒绝 cast Static      更新时间:2023-10-16

我正在学习 c++ 类型转换。我有这段代码

class Y 
{
private:
    int m_y;    
};
class X
{
public:
    operator Y() { return Y(); }
private:
    int m_x;    
};
int _tmain(int argc, _TCHAR* argv[])
{
    X x;
    Y y;
    y = static_cast<Y>(x); // calls the user defined conversion operator
    Y* yPtr;
    yPtr = static_cast<Y*>(&x); // error C2440: 'static_cast' : cannot convert from 'X *' to 'Y *'.
                                // Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
}

为什么C++不使用用户定义的转换运算符返回指向从对象 x 转换而来的 Y 对象的指针?

尽管给定类型的对象可以转换为另一种类型,但您不一定不能强制转换它们的指针。

在此示例中,将X转换为Y表示"采用此X,并让我从中Y"。X不是Y,但它可以转换为。

X*转换为Y*表示"这是指向X的指针,现在我说它是指向Y的指针"。这没有意义,因为X不是Y,因此在转换对象之前,您不能将其视为一个。

statc_cast对象有效,因为您使用转换构造函数创建了对象的临时对象。

但是,当您static_cast指针时,您正在创建指针的临时副本。指针没有转换构造函数。

您不能static_cast指向另一个的不相关的指针。即使他们有转换构造函数,也不会。

即使允许这样做,也要考虑如果它像static_casting对象一样工作会发生什么:将使用转换构造函数创建临时,但不是将临时分配给变量,而是将临时的地址分配给指针。但由于表达式后不存在临时内存,因此指针将立即指向无效内存。