我正在尝试创建一个非空的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
被入侵?
答案 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