我正在学习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对象的指针?
答案 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一样工作会发生什么:使用转换构造函数创建临时文件,但是不是将临时文件分配给变量,而是分配地址。临时指针。但由于表达式后临时不存在,指针会立即指向无效的内存。