Как поменять местами два объекта без оператора копирования?
У меня есть класс А, где, оператор копирования копирования удаляется. Как я должен поменять местами два экземпляра?
Я пытался с помощью std::swap
но это не сработало.
class A {
private:
int a;
public:
A& operator=(const A& other) = delete;
A(int _a = 0):a(_a){}
void showA() { std::cout << a << std::endl; }
};
int main()
{
A obj1(10);
A obj2(20);
obj1.showA();
obj2.showA();
//A temp;
//temp = obj1;
//obj1 = obj2;
//obj2 = temp;
obj1.showA();
obj2.showA();
}
Я жду obj1
а также obj2
поменяться местами. Первоначально obj1.a
является 10
а также obj2.a
является 20
, Я жду obj1.a
быть 20
а также obj2.a
быть 10
когда сделано.
1 ответ
Решение
Как указал @Yksisarvinen, вам нужно иметь конструктор перемещения и задание перемещения, чтобы получить std::move
работать:
#include <iostream>
#include <utility>
class A {
private:
int a;
public:
A(int a_) : a(a_) {}
A(const A& other) = delete;
A& operator=(const A&) = delete;
A(A&& other) {
a = other.a;
}
A& operator=(A&& other) {
a = other.a;
return *this;
}
void showA() { std::cout << a << std::endl; }
};
int main(int argc, char* argv[]) {
A obj1(10);
A obj2(20);
obj1.showA();
obj2.showA();
std::swap(obj1, obj2);
std::cout << "swapped:" << std::endl;
obj1.showA();
obj2.showA();
return 0;
}