【发布时间】:2013-04-11 08:14:28
【问题描述】:
我想知道(只是出于好奇)为什么 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;
注意 'a + b' 如何创建一个新的 Vector 对象,然后只将其地址复制到 'c' 中,而不调用复制构造函数。所以它可以解决新的右值引用解决的相同问题。此外,据我所知,它几乎等同于在 C# 中使用运算符重载时发生的情况(但我在这里可能错了,我从未真正使用过 C#),以及为什么在 C# 中不需要右值引用。
确实,右值引用解决方案更好,因为它允许基于堆栈的对象,而这种重载将强制所有 Vector2d 对象都存在于堆上,但它似乎仍然很容易实现在编译器中,可能在右值引用出现之前几年。使用自定义分配器,它甚至不会那么慢。
那么这仅仅是因为“最小惊喜”原则是非法的,还是还有其他原因?
【问题讨论】:
-
您也可以拥有指向基于堆栈的对象的指针。
-
在
a和b中使用new有什么意义? (c有点道理,但还是在自找麻烦) -
我认为这是最不意外的原则。例如 operator- 在两个指针上定义。因此,在您的示例中,您将定义 operator+ 和 operator- ,但做的事情完全不同。
-
new Vector2d-- 它是什么,Java?
标签: c++ operator-overloading rvalue-reference