防止std :: move在对象上?

时间:2019-04-13 00:54:51

标签: c++ std

我正在尝试创建一个非空的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;
};

我的目标是仅在release()是临时的情况下才允许unique_ref

问题是有人可以使用std::move()来解决这个问题:

unique_ref<int> p;
int* p2 = std::move(p).release();

有没有办法防止它move被入侵?

2 个答案:

答案 0 :(得分:2)

就重载解析而言,无法将prvalue(临时)与xvalue(std::move的结果)区分开。

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

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

答案 1 :(得分:2)

您将不得不放弃resource "google_container_node_pool" "primary_preemptible_nodes" { node_config { service_account = "${google_service_account.gke_nodes.email}" oauth_scopes = [ "storage-ro", "logging-write", "monitoring" ] } } 案。当用户调用std::move时,他们会发出强烈的信号,表明他们确切地知道自己在做什么。

尽管可以在调试期间保护自己。

例如,我会考虑像这样开始类定义:

std::move