为什么有人要创建默认移动构造函数但删除移动赋值运算符?

3

今天我遇到了一个以下布局的类(c++14)

class A {
//ctor  
A(..some specific parameter) :..init some members .. {}; 
//copy ctor
A(A const&) = delete;
//copy assign op
A& operator=(A const&) = delete;
//move operator
A(A&&) = default;
//move assign op
A& operator=(A&&) = delete;
//dtor
~A() = default;
}

创建默认移动构造函数但删除移动赋值运算符的意图是什么?使用该类会有什么影响/限制?
更新: 我不能分享类的细节,但评论和答案指向了正确的方向,这完全是关于资源分配和初始化。 非常感谢大家 - 你们让我的一天!!!

2
可能的原因是:如果您有一个const成员变量,那么移动构造函数可以(必须)初始化它,但移动赋值不可能(因为它可能会尝试覆盖const成员变量)。 (复制构造函数与复制赋值也是如此。)我在您公开的示例代码中没有看到任何const成员变量。所以,这只是一个猜测... - Scheff's Cat
2
每当您想要一个对象可构造但不可复制时,可以这样做。 - A. Gille
1
使用RAII类时的影响/限制:可以进行初始化,但不能进行赋值。也就是说,您可以通过移动现有实例的内容来初始化新实例。(关于怀疑的const成员变量-它可能会将move降级为copy,但这不一定是问题。)一旦实例被初始化,您可以将其删除或移动到另一个实例,但不能进行其他操作。资源管理是此类的一个用例。(如果您拼出RAII,这就有意义了。);-) - Scheff's Cat
1
你能告诉我们你在哪里看到这个类的布局吗?这可能有助于我们弄清楚为什么它被写成那样。 - cigien
1个回答

2
这意味着一旦对象创建后,它的某些值就无法更改。当然你可以移动它,但一旦这样做了,你就不能再回到它。
考虑一个具有此设计的unique_ptr。这样的指针将允许您转移所有权,但只能转移到新构建的unique_ptr。因此,如果您创建了一个unique_ptr,那么该指针对象实例将管理该特定对象,或者它将不管理任何内容,因为您之前已经从中移动了。它永远不会管理不同的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接