簡體   English   中英

將Rvalues傳遞給副本構造函數和賦值運算符

[英]passing Rvalues into a copy constructor and assignment operator

在我看來,將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值的復制構造函數和賦值運算符?

謝謝您的幫助

您正在濫用復制控制器和賦值運算符來實現移動。 按照慣例,復制c'tors和賦值運算符會接收const引用,該引用可以綁定到r值和l值。 但是,如果您想實現移動,請使用移動控制器和賦值運算符:

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

將移動語義與復制混淆在一起只會在以后造成麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM