防止 std::move 在对象上?

sea*_*te7 5 c++ std

我正在尝试创建一个 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?

eer*_*ika 2

std::move就重载解析而言,无法区分纯右值(临时值)和 x值( 的结果)。

并且无法阻止std::move将左值转换为x值。

release不是非空保证“唯一指针”可以支持的操作。移动构造/分配也不是。据我所知,保证的唯一方法是使指针不可移动,并使复制操作分配深复制。