从堆栈上的匿名对象返回对*this的引用
Returning a reference to *this, from an anonymous object on stack
假设类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
将一直存在到;
。
相关文章:
- 为什么我需要在转换构造函数上引用 this->?
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 使用 decltype(this) 获取函数引用
- 当取消引用运算符 (*) 重载时,*this 的使用是否受到影响?
- 难道不应该有一个类似于"this"的与名称无关的类指针供成员函数在C++中引用吗?
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 返回 *this,尝试级联,并且不返回引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- G++ 4.9.2 传递引用'this'时的回归
- 使用"this ->"引用类的成员是否有好处或性能提升?
- C++ 通过引用将“this”传递到方法中
- 返回对"this"的取消引用的重写方法
- 如果参数采用引用,在函数参数中传递 *this 会导致内存泄漏
- C++如何将'this'传递给指针引用
- 为什么 fstream 方法返回对"*this"的引用?
- 错误 C2355:'this':只能在非静态成员函数或非静态数据成员初始值设定项中引用
- 什么时候应该使用指针或引用成员,什么时候应该在Qt中传递nullptr或this作为父指针
- 是否允许将 *this 作为接受引用(&)的函数的参数传递?
- 为什么"return *this"返回引用?