【发布时间】:2012-11-28 09:12:46
【问题描述】:
首先,让我带你们进入我的思想大道(简单地说,我只是在想象这些事情)
假设,我正在使用使用移动语义(右值引用)的第三方库类。这是它的定义:
class VeryHeavyObject {
VeryHeavyObject(const VeryHeavyObject& obj); // copy constructor
VeryHeavyObject& operator= (const VeryHeavyObject& obj); // copy operator
public:
VeryHeavyObject(); // constructor
VeryHeavyObject(VeryHeavyObject&& obj); // move constructor
VeryHeavyObject& operator= (VeryHeavyObject&& obj); // move operator
// ....
};
显然,作者真的很担心复制VeryHeavyObject 的成本,并决定强制移动所有内容(更明显的是,他不知道如何设计具有移动语义的类)。但是,在我的代码中,我需要有一个VeryHeavyObject 的副本。
嗯,核心问题是: 如何仅使用移动构造函数和移动运算符来复制对象?
P.S.:我已经尝试过,但我无法真正联系到图书馆的作者(我认为他正在度假)。
【问题讨论】:
-
VeryHeavyObject有完整的接口吗?可能有
.clone()方法。 -
@KennyTM 可能作者只是不知道如何设计类,忘记了克隆方法。 (请明白我的意思)
-
是因为对象很重,还是因为它真的不应该被复制(例如它代表一个独特的资源)?
-
为什么首先需要复制它?可能没有必要。例如使用
emplace_back而不是push_back用于 stl 容器... -
注意:在 C++11 中,您应该使用
= delete来删除方法,而不是仅仅将它们设为private(如果仍在使用它们会引发链接错误)。但是它没有实际意义,因为 §12.8/7 精确如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除;,因此您正在做额外的工作妨碍编译器的诊断;)
标签: c++ c++11 rvalue-reference