我需要实现具有如下签名的函数(具体是运算符):
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
? 有没有我不知道的副作用?