imr*_*mre 4 c++ operator-overloading rvalue-reference
我想(为了好奇)为什么在C++中不允许运算符重载指针.我的意思是这样的:
Vector2d* operator+(Vector2d* a, Vector2d* b) { return new Vector2d(a.x + b.x, a.y + b.y); }
Vector2d* a = new Vector2d(1, 1);
Vector2d* b = new Vector2d(2, 2);
Vector2d* c = a + b;
Run Code Online (Sandbox Code Playgroud)
注意'a + b'如何创建一个新的Vector对象,然后只将其地址复制到'c',而不调用复制构造函数.因此,它将解决新的右值引用解决的相同问题.另外,据我所知,它几乎等同于在C#中使用运算符重载时发生的事情(但我可能在这里错了,我从未真正使用过C#),以及为什么在C#中不需要rvalue refs.
是的,rvalue参考解决方案甚至更好,因为它允许基于堆栈的对象,而这种重载会强制所有Vector2d对象都存在于堆上,但是,它似乎很容易在编译器中实现,可能在rvalue refs到来之前的几年.使用自定义分配器,它甚至不会那么慢.
因此,这只是非法的,因为"最不意外"的原则,还是有其他原因?
是的,rvalue参考解决方案甚至更好,因为它允许基于堆栈的对象,而这种重载会强制所有Vector2d对象都存在于堆上,但是,它似乎很容易在编译器中实现,可能在rvalue refs到来之前的几年.使用自定义分配器,它甚至不会那么慢.
因此,这只是非法的,因为"最不意外"的原则,还是有其他原因?
a + b + c应该做什么,泄漏内存?注意'a + b'如何创建一个新的Vector对象,然后只将其地址复制到'c',而不调用复制构造函数.因此,它将解决新的右值引用解决的相同问题.
通常实现的返回值优化也解决了这个问题,帮助编译器安排将返回值直接构造到调用者的缓冲区中.
| 归档时间: |
|
| 查看次数: |
5752 次 |
| 最近记录: |