gpt4 book ai didi

c++ - 混淆右值引用和 const 左值引用作为参数

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:47 25 4
gpt4 key购买 nike

因此,复制构造函数的参数列表由一个 const 左值引用组成,如 const B& x。然而,移动构造函数的参数列表包含一个右值引用,如 B&& x

当我发现这一点时,我觉得很奇怪,所以我尝试定义一个以 const 左值引用作为参数的函数:

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

我已经知道 const 左值引用可以绑定(bind)到任何东西,所以结果有点像预期的那样。我尝试同时使用左值和右值调用该函数,正如预期的那样,一切正常:

calculator(Intvec(33)); //works
Intvec newvec(22);
calculator(newvec); //works

然后我尝试将 calculator 的参数列表更改为右值引用,正如预期的那样,在调用它时只有右值有效。

既然 const 左值引用可以将左值和右值作为参数,为什么移动构造函数不只使用 const 左值引用而不是右值引用?为什么不总是使用一般的 const 左值引用,就像在你不会做与移动构造函数中发生的事情相同的情况下?

最佳答案

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

接受 const 左值引用的移动构造函数不允许修改移动对象,因此您不能做任何在复制构造函数中不能做的事情。事实上,这样的移动构造函数在各个方面都与复制构造函数相同。当它与复制构造函数完全相同时,为什么人们会称其为移动构造函数?


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

关于c++ - 混淆右值引用和 const 左值引用作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44738829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com