我正在尝试创建一个 not-null unique_ptr。
template <typename T>
class unique_ref {
public:
template <class... Types>
unique_ref(Types&&... Args) { mPtr = std::make_unique<T, Types...>(std::forward<Types>(Args)...); }
T* release() && { return mPtr.release(); }
T* release() & = delete;
private:
std::unique_ptr<T> mPtr;
};
Run Code Online (Sandbox Code Playgroud)
release()我的目标是仅在临时情况下允许unique_ref。
问题是有人可以用来std::move()“绕过”这个:
unique_ref<int> p;
int* p2 = std::move(p).release();
Run Code Online (Sandbox Code Playgroud)
有没有办法防止它被move'd?
std::move就重载解析而言,无法区分纯右值(临时值)和 x值( 的结果)。
并且无法阻止std::move将左值转换为x值。
release不是非空保证“唯一指针”可以支持的操作。移动构造/分配也不是。据我所知,保证的唯一方法是使指针不可移动,并使复制操作分配深复制。
| 归档时间: |
|
| 查看次数: |
791 次 |
| 最近记录: |