即使定义了用户定义的转换运算符,Static_cast也拒绝将指针强制转换为类

时间:2015-12-04 13:51:23

标签: c++

我正在学习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对象的指针?

2 个答案:

答案 0 :(得分:1)

虽然给定类型的对象可以转换为另一种类型,但您不一定能够转换它们的指针。

在此示例中将X转换为Y表示“从此处X并使其成为Y”。 X不是Y,但可以转换为一个。{/ p>

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

答案 1 :(得分:1)

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

但是当你static_cast指针时,你正在制作一个指针的临时副本。指针没有转换构造函数。

你不能static_cast与另一个无关的指针。即使他们有转换构造函数也不行。

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