Мне нужно реализовать функции (точнее, операторы) с сигнатурами, похожими на эти:
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
?Есть ли побочные эффекты, о которых я не знаю?