因此,复制构造函数的参数列表包含一个const值左侧引用,如const B& x
。
但是,移动构造函数的参数列表包含一个右值引用,如B&& x
。
当我发现这个时,对我来说这似乎很奇怪,所以我尝试定义一个以const左值引用为参数的函数:
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在调用它时才有效。
因为const左值引用可以将左值和右值作为参数,为什么移动构造函数不仅使用const左值引用而不是右值引用? 为什么不总是一直使用const左值引用,比如你不会像移动构造函数中发生的那样做?
答案 0 :(得分:1)
如果移动构造函数接受了const lvalue引用,那么移动构造函数的这种声明将与复制构造函数无法区分。必须有一种方法来区分它们,并且已经指定了语言,以便移动构造函数将rvalue引用作为参数。
接受const左值引用的移动构造函数不允许从对象移动修改,因此您无法执行在复制构造函数中无法执行的任何操作。实际上,这样的移动构造函数在各方面都与复制构造函数相同。当它与复制构造函数完全相同时,为什么会调用某个移动构造函数?
PS。您的实验揭示了一个有趣的事实:只要类具有复制构造函数(并且未显式删除移动构造函数),它是否具有移动构造函数不会影响该对象的使用方式。在适合移动的任何情况下,如果类没有移动构造函数,则可以使用副本。