因此,复制构造函数的参数列表由一个 const 左值引用组成,例如const B& x. 然而,移动构造函数的参数列表由一个右值引用组成,如B&& x.
当我发现这一点时,我觉得很奇怪,所以我尝试定义一个以 const 左值引用作为参数的函数:
void calculator(const Intvec& veccor)
{
cout << "in veccor" << veccor.m_size << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我已经知道 const 左值引用可以绑定到任何东西,所以结果有点在意料之中。我尝试使用左值和右值调用该函数,正如预期的那样,一切正常:
calculator(Intvec(33)); //works
Intvec newvec(22);
calculator(newvec); //works
Run Code Online (Sandbox Code Playgroud)
然后我尝试将参数列表更改为calculator右值引用,正如预期的那样,只有右值在调用它时起作用。
那么既然 const 左值引用可以同时接受左值和右值作为参数,为什么移动构造函数不只是使用 const 左值引用而不是右值引用呢?为什么不总是使用 const lvalue 引用,比如在你不会像移动构造函数中发生的事情一样的情况下?
如果移动构造函数接受 const 左值引用,则移动构造函数的此类声明将与复制构造函数没有区别。必须有一种方法来区分它们,并且已经指定了语言,以便移动构造函数将右值引用作为参数。
接受 const 左值引用的移动构造函数不允许修改移动的 from 对象,因此您无法执行在复制构造函数中无法执行的任何操作。事实上,这种移动构造函数在各方面都与复制构造函数相同。当它与复制构造函数完全相同时,为什么要称其为移动构造函数?
附注。你的实验揭示了一个有趣的事实:只要一个类有一个复制构造函数(并且没有显式删除移动构造函数),它是否具有移动构造函数并不影响该对象的使用方式。在任何适合移动的情况下,如果类没有移动构造函数,则可以使用副本代替。
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |