【发布时间】:2021-12-23 11:25:18
【问题描述】:
我现在正在使用代码库,这部分包含以下内容:
if(const auto *temp_ptr = obj->get_ptr()) {
perm_ptr = std::move(temp_ptr);
}
std::move 在这种情况下只是一个简单的指针有什么意义?与简单地做perm_ptr = temp_ptr相比似乎没有任何优势?
【问题讨论】:
-
没有优势。看来作者不知道
std::move是干什么的。 -
@DrewDormann 这样做有什么缺点吗?
-
@user5965026 它让代码的读者感到困惑,就像
perm_ptr = static_cast<typename std::remove_reference<decltype(temp_ptr)>::type&&>(temp_ptr);会 -
我实际上可以看到一个可能是故意的情况:如果
perm_ptr是某种自制软件unique_ptr带有operator=(T*&&)运算符,以便在呼叫站点清楚地表明所有权正在转移从原始指针到拥有指针。这是对语法的滥用,但这种事情也有类似的先例:stackoverflow.com/questions/69213032/in-place-stdmove-in-pubsub/… -
如果
perm_ptr也是一个原始指针,那么std::move()在这里没有意义。但是如果perm_ptr是某种对象,它带有一个重载的operator=并接受一个原始指针,那么std::move()可能 是有意义的,因为它允许operator=在之后重置原始指针复制它。
标签: c++ pointers move-semantics