c++ - 了解 C++ 标准的 move 语义

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

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

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

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

最佳答案

When we move an object with by std::move

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

it makes the object nullptr

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

如何和为什么的完整讨论超出了问答的范围,但是 any good book应该有一个。

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

关于c++ - 了解 C++ 标准的 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58580768/

相关文章:

c++ - 如何检测应用程序是否在 KVM 下运行?

c++限定符错误

c++ - Boost locale - 创建临时文件时需要取消设置 LANG

c - 插入无效输入时出错

c - 哪些选项与 gcc 一起使用以获得最大的安全检查?

c++ - C++ 编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败

在代码中保留断言的 C++ 测试套件

c++11 - C++ 允许将数据移出类成员的最佳方法是什么(std::move 语法)

c++ - move 语义说明

c++ - 使用 "new ClassType(std::move(/*class_object*/))"在 freestore 中构建对象