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

问题描述 投票:1回答:1

我正在努力弄清移动语义。我感到困惑,因为我找不到为什么我们需要它,以及我们应该如何理想地使用它。

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

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

c++ visual-c++ move-semantics
1个回答
3
投票

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

没有std::move不会移动任何东西。它为我们提供了一个引用某个对象的rvalue expression

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

它使对象为nullptr

这完全取决于所述功能的作用。通常,值得移动的对象具有间接状态,例如指向某些动态分配资源的指针。而且,如果所说的对象is

是可移动的,那么最好使用其移动构造函数对这些指针进行交换。如果没有将源对象的指针保留为nullptr,则您拥有拥有资源的two对象。那不是一个举动。这是[浅]副本。

关于方式和原因的完整讨论超出了问答的范围,但any good book应该有一个。

此外,如果这一切听起来像骇客,那是因为它是一个。 C ++是建立在骇客之上的骇客宝库,可随着时间的推移提供更多功能。

© www.soinside.com 2019 - 2024. All rights reserved.