从堆栈上的匿名对象返回对*this的引用

Returning a reference to *this, from an anonymous object on stack

本文关键字:this 引用 返回 堆栈 对象      更新时间:2023-10-16

假设类Coord3D有一个方法

Point2D& Coord3D::get2DPart(){
    return *(Point2D*)this;
}

(Coord3D只是int x;int y;, Point2D是它的2D版本,正好是int x;和int y;)

以下内容是否安全:

Point2D x = Coord3D(1,2,3).get2DPart();

或者甚至是

Coord3D x = Coord3D(1,2,3).getSelf();

其中getSelf()return *this;

的函数

似乎它可能是安全的,但我问的人不确定。这样可以吗?

编辑:这是什么coord3D和Point2D:

struct Coord3D{
   float x; float y; float z;
};
struct Point2D{
   float x; float y;
};

Point2D x = Coord3D(1,2,3).get2DPart();

等价于:

Point2D x( Coord3D(1,2,3).get2DPart() );

您在这里创建的临时Coord3D将持续到Point2D的构造函数被执行的时候。因此,在该范围内使用Coord3D 'a this是安全的。

注意*(Point2D*)this有气味。如果Point3D继承自Point2D,则可以只返回*this。如果它们不相关,那就危险了。


编辑,在问题关于类型的更新之后:

考虑到Point2D和Point3D不相关,将一个转换到另一个可能有效,但这是非常不建议的。更好的方法是从Point2D继承Point3D。另一种选择是添加GetPoint2D()Point3D,并让它从3D中创建一个新的2D点。但是,在返回对局部变量的引用时可能会遇到真正的问题。最后,如果您冒险按原样强制转换,至少使用reinterpret_cast而不是c风格的强制转换。

假设转换首先是有效的(标准布局类型的公共子序列或任何适用于您的情况),那么是的,这是有效的,因为*this将一直存在到;