我想知道(只是出于好奇)为什么在 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 对象都存在于堆上,但是,它似乎在编译器中很容易实现,可能在右值参考出现之前几年。使用自定义分配器,它甚至不会那么慢。
那么这仅仅是因为“最小惊喜”原则而违法,还是还有其他原因?