Static_cast拒绝强制转换指向类的指针,即使定义了用户定义的转换运算符也是如此
Static_cast refuses to cast pointers to a class even with user defined conversion operator defined
我正在学习 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对象一样工作会发生什么:将使用转换构造函数创建临时,但不是将临时分配给变量,而是将临时的地址分配给指针。但由于表达式后不存在临时内存,因此指针将立即指向无效内存。
相关文章:
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 模拟返回具有多个用户定义转换的类型的方法
- 是否可以使用明确的模板参数调用模板的用户定义转换操作员
- 使用自定义转换运算符的不明确性
- C++显式积分用户定义转换
- 解决隐藏歧义的不明确用户定义转换
- 如何自定义转换模板参数
- 用户定义转换的第二个标准转换序列
- 如何将串联的定义转换为RC文件中的字符串
- 是否可以用C++编写自定义转换运算符(如“static_cast”)
- Qt4:QGraphicsScene/View和自定义转换方法
- 如何将c结构体定义转换为c++
- 如何在VS2008中将#define定义转换为字符串
- 为什么模板化的用户定义转换操作符能够确定其返回类型?
- #定义转换为LPCSTR或std::string的字符串
- 错误无效的用户定义转换
- 无效的用户定义转换错误
- 是否有方法为任何指针类型定义转换操作符
- Visual C++ 不存在从"myClass1"到"myClass1"的合适用户定义转换
- 提振.Python自定义转换器