rvalue引用和const左值引用之间的混淆作为参数

时间:2017-06-24 16:59:03

标签: c++

因此,复制构造函数的参数列表包含一个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左值引用,比如你不会像移动构造函数中发生的那样做?

1 个答案:

答案 0 :(得分:1)

如果移动构造函数接受了const lvalue引用,那么移动构造函数的这种声明将与复制构造函数无法区分。必须有一种方法来区分它们,并且已经指定了语言,以便移动构造函数将rvalue引用作为参数。

接受const左值引用的移动构造函数不允许从对象移动修改,因此您无法执行在复制构造函数中无法执行的任何操作。实际上,这样的移动构造函数在各方面都与复制构造函数相同。当它与复制构造函数完全相同时,为什么会调用某个移动构造函数?

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