C++运算符重载指针

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到来之前的几年.使用自定义分配器,它甚至不会那么慢.

因此,这只是非法的,因为"最不意外"的原则,还是有其他原因?

Ton*_*roy 7

是的,rvalue参考解决方案甚至更好,因为它允许基于堆栈的对象,而这种重载会强制所有Vector2d对象都存在于堆上,但是,它似乎很容易在编译器中实现,可能在rvalue refs到来之前的几年.使用自定义分配器,它甚至不会那么慢.

因此,这只是非法的,因为"最不意外"的原则,还是有其他原因?

  • 它没有正确链接...... a + b + c应该做什么,泄漏内存?
  • 指针算法在C++中已经有了一定的意义......它对于跨类型保持一致非常有用,否则算法就无法在对象的容器上正常工作.
  • 按值返回某些东西意味着对象不需要被调用者清理:如果它使用免费存储(堆)来存储实际数据,它将根据需要自动删除它.使持续强大的内存使用更容易.

注意'a + b'如何创建一个新的Vector对象,然后只将其地址复制到'c',而不调用复制构造函数.因此,它将解决新的右值引用解决的相同问题.

通常实现的返回值优化也解决了这个问题,帮助编译器安排将返回值直接构造到调用者的缓冲区中.