RVALUE参考与const lVALUE参考作为参数之间的混淆



因此,复制构造函数的参数列表由const lvalue参考组成,例如 const B& x。但是,移动构造函数的参数列表由RVALUE参考组成,例如B&& x

当我发现这一点时,对我来说似乎很奇怪,所以我试图定义一个函数,以const lvalue参考为参数:

void calculator(const Intvec& veccor) 
{ 
cout << "in veccor" << veccor.m_size << "n"; 
}

我已经知道const lvalue参考可以与任何事物结合,因此结果是预期的。我尝试使用lvalue和rvalue调用该功能,并且正如预期的那样,一切都起作用:

calculator(Intvec(33)); //works
Intvec newvec(22);
calculator(newvec); //works
然后,我尝试将calculator的参数列表更改为RVALUE参考,并且正如预期的那样,只有RVALUE在调用它时才起作用。

因此,由于const lvalue参考可以同时将lvalues和rvalues作为参数,所以为什么移动构造函数不仅使用const lvalue参考而不是rvalue参考?为什么不总是使用const lvalue参考,例如在您不做移动构造函数中发生的事情的情况下?

如果移动构造函数接受了const lvalue参考,则该移动构造函数的声明将与复制构造函数没有区别。必须有一种区分它们的方法,并且已经指定了语言,以使Move构造函数将RVALUE参考作为参数。

可以接受const lvalue参考的移动构造函数将不允许修改从对象的移动,因此您无法在复制构造函数中做任何无法做的事情。实际上,这种移动构造函数在各个方面都与复制构造函数相同。当它与复制构造函数完全相同时,为什么将某个事物称为移动构造函数?


ps。您的实验揭示了一个有趣的事实:只要类具有复制构造函数(并且没有明确删除移动构造函数(,无论它是否具有移动构造函数,都不会影响如何使用该对象。在任何情况下,在任何情况下,如果类没有移动构造函数,则可以使用副本。

最新更新