【问题标题】:Understanding Move Semantics of C++ Standard了解 C++ 标准的移动语义
【发布时间】:2020-02-23 02:52:05
【问题描述】:

我正试图了解移动语义。我很困惑,因为我不知道我们为什么需要它以及我们应该如何理想地使用它。

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

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

【问题讨论】:

  • when we move an object with by std::move, it makes the object nullptr. 什么? Also, why std::move turn an object to rvalue? 因为这就是它的目的how does this happen? 一个简单的演员表。
  • 你在用哪本书?一点都不复杂(与 C++ 的许多其他方面相比)
  • std::move 只不过是一个演员表。它本身不会改变任何对象。它所做的只是在某些情况下启用一个动作。
  • 我什至不敢称它为演员表,tbh。没有类型改变;这只是身份功能。但是因为它是一个函数,所以它的结果是一个右值表达式。尤泽尔。
  • 你知道吗,我收回来:我想这一切的骇人听闻确实让我想完全摸索有点复杂

标签: c++ visual-c++ move-semantics


【解决方案1】:

当我们用 std::move 移动对象时

没有。 std::move 不动。 It gives us an rvalue expression referring to some object. 右值表达式导致重载决议选择采用右值引用的函数,这很方便,因为现在我们将选择那些而不是采用值的函数,或左值引用,传统上做类似复制的事情。这样的函数往往是构造函数(所谓的“移动构造函数”)或赋值运算符(所谓的“移动赋值运算符”),因为在构造和赋值过程中移动是有用的。

它使对象为 nullptr

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

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

另外,如果这一切听起来像是一个 hack,那是因为它是一个。 C++ 是一个基于 hack 的大杂烩,随着时间的推移提供额外的功能。在这种情况下,我们需要(阅读:wanted)一种创建不同类型的构造函数(和赋值运算符)的方法,一种可以采用非const 引用并可以修改源代码的方法对象(“窃取”它的资源),为了实现这一点,我们必须引入一种只绑定到 rvalues 的新引用(因为我们已经将其他所有内容用于副本),然后我们必须引入一个实用函数,它将对象的名称转换为 rvalue ...因此,std::move 诞生了,这个实用函数不会移动任何东西。 ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多