何时在C ++中隐式复制了一个类?
我有一个包含unique_ptr的类,因此无法安全复制,因此,我通过创建X(X&)
和X& operator = X&
的私有版本来禁用该类的复制构造函数。
我立即遇到了无法返回此类实例的问题,因为返回实际上是该实例的副本。
我还需要注意其他任何情况吗?
答案 0 :(得分:3)
返回不复制实例,移动实例。你只是忘了提供移动构造函数。此外,在大多数情况下,在标准容器中使用类时,现在会移动类。
简而言之,提供一个移动构造函数和移动赋值运算符(最好是交换),您应该会发现几乎所有复制都是隐式的情况,它们现在都在移动。
答案 1 :(得分:2)
我们想到的情况是:按值接收类的函数,按值返回的函数,以及包含该类的任何类或容器。像std :: vector这样的类会尽可能使用移动语义(你确实超载了)?但是将无法使用需要复制构造函数的函数,例如复制向量。正如GMan所说,你可以为你的类制作一个复制构造函数,如果你想让事情变得更容易,可以手动执行std :: unique_ptr的深层复制。