将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值的复制构造函数和赋值运算符?
感谢您的帮助
答案 0 :(得分:0)
您正在滥用副本c&#tor和赋值运算符来实现移动。通常,复制c和赋值运算符接收const
个引用,它们可以绑定到r值和l值。但是,如果您想要移动,请使用移动和分配运算符:
node(node&& n){ /* pilfer 'n' all you want */ }
node& operator=(node&& n) { /* ditto */ }
将移动语义与复制混淆只会导致以后出现问题。