c++ - 如何在没有复制赋值运算符的情况下交换两个对象?

标签 c++ swap copy-assignment

我有一个 A 类,其中复制赋值运算符被删除。我应该如何交换 A 的两个实例?

我尝试使用 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();
}

我希望 obj1obj2 被交换。最初 obj1.a10obj2.a20,我期望 obj1.a<完成后,20obj2.a10

最佳答案

正如 @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;
}

关于c++ - 如何在没有复制赋值运算符的情况下交换两个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54610928/

相关文章:

c++ - C 或 C++ - 与重复的组合

c++ - 异常安全 : Benefits of a nothrow swap

iOS 应用程序 : Swapping rootviewcontroller after performing login using swift has significant delay

c++ - 根据复制操作符或单独执行复制操作符?

c++ - Gcc 使用 memcpy 作为隐式复制赋值运算符而不是成员复制

c++ - 什么时候调用复制赋值运算符?

c++ - 基类中的 switch 语句需要使用派生类的值

c++ - 在 C++ 中对多维数组进行排序

c++ - 是否可以在一个语句中进行 2 个相反的位操作?

c# - 变量改变...另一个变量?