c++ - 在什么情况下我应该考虑实现移动构造函数和移动运算符?

标签 c++ constructor c++11 rvalue-reference

对于标准的复制构造函数和赋值运算符,如果我的类实现了析构函数,我总是考虑实现它们或删除默认值。

对于新的移动构造函数移动运算符,考虑是否需要实现的正确方法是什么?

作为从 C++0x 之前的系统转换系统的第一步,我是否可以删除默认的移动构造函数移动运算符 还是我应该让他们一个人呆着?

最佳答案

不必担心它,因为当您用户声明析构函数(或 12.8/9 中列出的任何其他内容)时,会阻止默认移动构造函数被产生。因此,不存在与拷贝相同的风险,默认值是错误的。

所以,作为第一遍,让他们一个人呆着。在您现有代码中的某些地方,C++11 移动语义允许移动,而 C++03 规定了一个拷贝。你的类将继续被复制,如果这在 C++03 中没有导致性能问题,那么我不能立即想到它在 C++11 中会出现的任何原因。如果它确实导致了 C++03 中的性能问题,那么您就有机会修复您的代码中以前从未遇到过的错误,但这是一个机会,而不是义务;-)

如果您稍后实现移动构造和赋值,它们将被移动,特别是如果您认为您的类的 C++11 客户端不太可能使用“swaptimization”来避免复制,您将希望这样做,比 C++03 客户端更有可能按值传递类型等。

在 C++11 中编写新类时,您需要根据在 C++03 中考虑和实现 swap 的相同标准来考虑和实现移动。可以复制的类实现了 C++11 的“可移动”概念,(就像 C++03 中可以复制的类可以通过 std 中的默认实现进行交换),因为“可移动”并没有说明源处于什么状态——特别是允许它保持不变。所以拷贝有效的移动,它不一定是有效的,对于许多类,您会发现与“好”移动或交换不同,拷贝可以抛出。

如果你有一个析构函数(因此没有默认的移动构造函数),并且你还有一个可移动但不可复制的数据成员(因此也没有默认的复制构造函数),你可能会发现你必须为你的类实现移动).这就是 move 在语义和性能上变得重要的时候。

关于c++ - 在什么情况下我应该考虑实现移动构造函数和移动运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472208/

相关文章:

c++ - 如何将变量传递给 windows.h 函数 text()?

c++ - fin >> noskipws >> ch 始终为 false

c++ - 错误实现派生类构造函数 : "No Instance of Overloaded Function Matches the Specified Type

C++ 委托(delegate)构造函数

extern C 结构的 C++ 默认复制/移动赋值运算符不是 const

c++ - 如何提取可变参数函数的一组选定参数并使用它们调用另一个函数

c++ - 为什么即使程序处于空闲状态(根据进程资源管理器),简单的 glfw 程序也会占用所有可用的 CPU?

c++ - 固定大小的unordered_map,如何定义?

java - Java中Scanner的构建和使用

c++ - 模板化双模板类方法