我需要使用签名来实现功能(具体来说是运算符):
friend MyClass operator+(MyClass&& lhs, MyClass& rhs);
friend MyClass operator+(MyClass&& lhs, MyClass&& rhs);
friend MyClass operator-(MyClass&& lhs, MyClass& rhs);
friend MyClass operator-(MyClass&& lhs, MyClass&& rhs);
MyClass& operator+=(MyClass& other);
MyClass& operator+=(MyClass&& other);
MyClass& operator-=(MyClass& other);
MyClass& operator-=(MyClass&& other);
这些是8个函数,但从道德上讲只有两个实现,因为所有+和-运算基本相同。我想避免只为迎合不同的右值签名而写4次相同的东西。有没有一种规范的方法可以做到这一点?我想到了这样的东西:
MyClass& operator+=(MyClass&& other) {
... // Actual implentation details.
return *this;
}
MyClass& operator+=(MyClass& other) {
return *this += std::move(other);
}
MyClass operator+(MyClass&& lhs, MyClass&& rhs) {
auto myClass = MyClass(); // Copy ctor is deleted.
myClass += rhs;
return myClass;
}
MyClass operator+(MyClass&& lhs, MyClass& rhs) {
return std::move(lhs) + std::move(rhs);
}
// Similar implementations for operator- and operator-=.
这似乎可行,但是由于我对移动语义世界并不十分自信,因此我不确定我是否写过可怕的东西,并且有一种更容易,更干净的方法来做到这一点。例如,使用std::move
的开销是多少?我不知道有副作用吗?