我们应该删除这段代码中的移动构造函数和赋值吗?

问题描述 投票:0回答:1

在此代码中,

On_heap
是管理堆上对象的包装器。是否必须删除此处的移动构造函数和赋值?

template<typename T>
struct On_heap {
On_heap() :p(new T) { } // allocate
˜On_heap() { delete p; } // deallocate
T& operator∗() { return ∗p; }
T∗ operator−>() { return p; }
On_heap(const On_heap&) = delete; // prevent copying
On_heap operator=(const On_heap&) = delete;
private:
T∗ p; // pointer to object on the free store
};
c++ c++11
1个回答
0
投票

这里必须删除移动构造函数和赋值吗?

不,C++ 不要求您删除此处的移动构造函数或移动赋值。

任何文明国家的法律也没有。

雇主可能提供编码标准,要求删除移动构造函数或移动分配,但我将其留给您和您的雇主。


对于你没有问的问题,当你删除这两个特殊成员函数失败时会发生什么?

那么,由于您已经实现或删除了另一个特殊成员函数,因此不会生成自动版本。大多数尝试使用它们都会找到已删除的特殊成员函数并生成错误。

它不会让你移动物体。

现在,当您似乎正在重新实现

unique_ptr
时,经验表明您想要允许移动。不允许移动的智能指针(例如
QScopedPtr
)通常被认为限制过多。通常,您希望用一段代码创建一个资源,然后将其存储在其他地方;并且作用域不可移动指针会妨碍这一点。

所以你可能应该进行移动操作;这些应该将其拥有的指针设为空,并且在给定空资源时清理代码不应崩溃。

所以从这个意义上说,如果你想允许对象被移动,那么你确实必须实现移动构造函数和移动赋值。

强制取决于谁和什么在执行命令。

© www.soinside.com 2019 - 2024. All rights reserved.