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