将右值传递给复制构造函数或赋值操作符对我来说似乎是一件非常重要的事情。例如:
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值?
Thanks for the help
您正在错误地使用复制c'tor和赋值操作符来实现移动。通常,复制操作符和赋值操作符接收const
引用,这些引用可以绑定到r值和l值。但是,如果您想实现移动,则使用move c'tor和赋值操作符:
node(node&& n){ /* pilfer 'n' all you want */ }
node& operator=(node&& n) { /* ditto */ }
将移动语义与复制混淆只会导致以后的麻烦。