将Rvalues传递给复制构造函数和赋值运算符

时间:2016-09-14 01:56:57

标签: c++ linked-list rvalue

将Rvalue传递给复制构造函数或赋值运算符在我看来是一件非常重要的事情。例如:

int a = b+c;

int a;
a = b+c;

如果没有这个,就很难进行数学计算 但是我无法用课程来做这件事。这是我的代码

#include <iostream>

using namespace std;

struct node{
public:
    node(int n){
        node* ptr = this;
        data = 0;

        for (int t=0; t<n-1; t++){
            ptr -> next = new node(1);
            ptr = ptr -> next;
            ptr -> data = 0;
        }

        ptr -> next = NULL;
    }
    node(node &obj){
        node* ptr = this;
        node* optr = &obj;
        while (true){
            ptr -> data = optr -> data;
            optr = optr -> next;
            if (optr == NULL) break;
            ptr -> next = new node(1);
            ptr = ptr -> next;
        }
    }
    void operator=(node &obj){
        delete next;
        node* ptr = this;
        node* optr = &obj;
        while (true){
            ptr -> data = optr -> data;
            optr = optr -> next;
            if (optr == NULL) break;
            ptr -> next = new node(1);
            ptr = ptr -> next;
        }
    }
    ~node(){
        if (next != NULL) delete next;
    }


private:
    double data;
    node* next;
};

node func1(){
    node a(1);
    return a;
}

void func2(node a){
    node b(1);
    b = func1();
}



int main(){
    node v(3);
    func1();
    func2(v);
}

我收到了这个编译错误:

expects an l-value for 1st argument

如何编写一个带有r值和l值的复制构造函数和赋值运算符?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您正在滥用副本c&#tor和赋值运算符来实现移动。通常,复制c和赋值运算符接收const个引用,它们可以绑定到r值和l值。但是,如果您想要移动,请使用移动和分配运算符:

node(node&& n){ /* pilfer 'n' all you want */ }
node& operator=(node&& n) { /* ditto */ }

将移动语义与复制混淆只会导致以后出现问题。