了解C ++标准的移动语义

1 c++ visual-c++ move-semantics

我正在努力使自己了解移动语义。我很困惑,因为我找不到为什么我们需要它,以及如何理想地使用它。

例如,当我们通过std :: move移动对象时,它将使对象变为nullptr。为什么会这样?另外,为什么std :: move将对象变成右值?这是怎么发生的?为什么在将std :: move与变量一起使用后,它没有用null填充,但是当我将其与vector之类的对象一起使用时,将其移动后,便用nullptr填充了它。

我希望有人逐步解释CPP的移动语义和其他语义。我读得越多,我就越困惑。它是CPP编程中最复杂的主题之一。

Lig*_*ica 5

当我们通过std :: move移动对象时

std::move不动的东西。它给了我们一个引用某个对象的右值表达式一个rvalue表达式会导致采用rvalue引用的重载分辨率选择函数,这很方便,因为现在我们将选择那些值而不是采用值或lvalue引用的函数,这些函数通常会执行类似复制的操作。这样的函数往往是构造函数(所谓的“移动构造函数”)或赋值运算符(所谓的“移动赋值运算符”),因为在构造和赋值过程中移动是有用的。

它使对象为nullptr

这完全取决于所述功能的作用。通常,值得移动的对象具有间接状态,例如指向某些动态分配资源的指针。而且,如果所说的对象可移动的,那么最好在其构造函数上对这些指针进行交换。如果它没有离开源对象的指针,nullptr那么您将拥有两个拥有资源的对象。那不是一个举动。这是一个[浅]副本。

关于问答方式和原因的完整讨论超出了问答的范围,但是任何一本好书都应该包含一本。

另外,如果这一切听起来像黑客一样,那是因为它是一个。C ++是建立在黑客基础之上的黑客大杂烩,可随着时间的推移提供其他功能。在这种情况下,我们需要(读:通缉)一种创建另一种构造函数(和赋值运算符)的方法,该方法将采用非const引用并可以修改源对象(以“窃取”其资源),为了实现这一点,我们必须引入一种仅绑定到右值的新型引用(因为我们已经将其他所有内容都用于复制),然后我们必须引入一种实用程序函数,该函数会将对象的名称转换为rvalue …因此std::move诞生了,它不会移动任何东西的效用函数。