当前位置: 首页 > 知识库问答 >
问题:

琐碎的复制和移动操作不同吗?

通远
2023-03-14

让我们来看看一些简单的移动可构造和(不是简单的)复制可构造(但仍然是复制可构造的)用户定义(类)类型A:

struct A
{
    A() = default;
    A(A const &) {}
    A(A &&) = default;
};

然后,的移动(move-construction或move-assignment)从字面上表示如下:源按位复制到目标,尽管操作名为“move”。在琐碎的移动过程中,右手边(形式上)不是const,但整个操作的琐碎性要求右手边(实际)不可变,不是吗?在我看来,这意味着,琐碎的复制操作和琐碎的移动操作在本质上是完全相同的(在内存、内存布局、位等方面)。我说的对吗?

如果是这样的话,那么我认为,如果我在用户代码中看到的是可移动构造的类型,而不是可复制构造的类型,那么我显然看到了一些反模式。我说的对吗?

共有1个答案

杨飞
2023-03-14

是否有这样的用例:一个类型可以有一个简单的复制构造函数而没有一个简单的移动构造函数?当然可以。

例如,如果指针包装类型在移动时始终为空,则可能非常有用。copy构造函数没有理由不重要,但是move构造函数必须将旧值设置为NULL。

template<typename T>
class empty_on_move
{
  T *ptr_;

public:
  empty_on_move(const empty_on_move&) = default;
  empty_on_move(empty_on_move &&other) : ptr_(other.ptr_) {other.ptr_ = nullptr;}
...
};

empty_on_move不拥有该对象,这就是为什么可以有它的多个副本。它的存在只是为了确保当您从它移动时,指针处于一个很好理解的状态。因此,is_trivially_copy_constructable > 为true,而is_trivially_move_constructable > 为false。

话虽如此,你真的问错问题了。为什么?因为答案无关紧要。

复制/移动构造函数/赋值的琐碎性唯一重要的时候是当您需要类型具有琐碎的可复制性时。正是这个属性允许使用memcpy之类的东西,而不是单个操作的琐碎操作。平凡的可复制属性要求复制/移动构造函数/赋值和析构函数都是平凡的(或删除,从C++14)。

如果您正在编写某个类型的包装器(或者编写一个sum/product类型),并且您希望公开该类型的属性,那么您只需要关注公开一些琐碎的可复制性。也就是说,如果t(或t...)是基本可复制的,那么您的类型也应该是基本可复制的。

 类似资料:
  • 问题内容: 是否有一个标准的Java库可以处理常见的文件操作,例如移动/复制文件/文件夹? 问题答案: 这是通过操作执行此操作的方法:

  • 本文向大家介绍python 安装移动复制第三方库操作,包括了python 安装移动复制第三方库操作的使用技巧和注意事项,需要的朋友参考一下 一、绪论 在使用python开发过程中经常会使用到第三方库。因此就涉及到了如何安装、复制移动。 二、安装方式 第三方库的安装方式 1、python自带包管理器:使用pip命令自动安装。例如:pip install xlwings 2、源码安装:在pypi下载的

  • 当类显式声明复制操作(即复制构造函数或复制赋值操作符)时,不会为该类声明移动操作。但是当类显式声明移动操作时,复制操作被声明为删除。为什么会存在这种不对称?为什么不指定如果声明了移动操作,则不会声明复制操作?据我所知,不会有任何行为差异,也不需要对移动和复制操作进行不对称处理。 [对于喜欢引用该标准的人,12.8/9和12.8/20中规定了具有复制操作声明的类的移动操作声明的缺失,12.8/7和1

  • 问题内容: 我实现了文件操作功能,并且我注意到Java提供了多种复制和移动文件的技术。在下面可以找到代码片段,简要描述了这些方法: 方法1: 方法2: 方法3: 方法4: 所有这些方法都有效,但是我不知道何时应使用它们?从性能和可靠性的角度来看,每种方法的优缺点分别是什么?当我不得不优先使用一种技术而不是另一种技术时,是否有任何特定情况? 问题答案: 我们可以将您的四种方法分为两种类型: 使用内置

  • 顾名思义,移动操作将目录或文件从一个位置移动到另一个位置。例如,我们想要将源代码移动到src目录中。修改后的目录结构将显示如下: 为了使这些更改永久性,必须将修改的目录结构推送到远程存储库,以便其他开发人员可以看到这些更改。 在其它开发人员的本地存储库中,在执行操作之前,它将显示旧的目录结构。在另外一台开发者机器上,执行以下命令 - 但是在执行操作之后,目录结构将被更新。 现在,假设在另外一个开发

  • 本文向大家介绍详解C++中对构造函数和赋值运算符的复制和移动操作,包括了详解C++中对构造函数和赋值运算符的复制和移动操作的使用技巧和注意事项,需要的朋友参考一下 复制构造函数和复制赋值运算符 从 C++ 11 中开始,该语言支持两种类型的分配:复制赋值和移动赋值。 在本文中,“赋值”意味着复制赋值,除非有其他显式声明。 赋值操作和初始化操作都会导致对象被复制。 赋值:在将一个对象的值赋给另一个对