移动指针有什么优势吗?

3

我现在正在处理一份代码库,其中有一个部分包含以下内容:

if(const auto *temp_ptr = obj->get_ptr()) {
  perm_ptr = std::move(temp_ptr);
}

在这种情况下,std::move有什么意义,因为它只是一个简单的指针?似乎与简单地执行perm_ptr = temp_ptr相比没有任何优势。

14
没有优势。似乎作者不知道 std::move 的作用。 - Drew Dormann
@DrewDormann 这样做有什么缺点吗? - user5965026
不对!std::move 使指针成为右值。而指针作为右值,没有任何区别。 - Drew Dormann
3
@user5965026的代码会让读者感到困惑,就像perm_ptr = static_cast<typename std::remove_reference<decltype(temp_ptr)>::type&&>(temp_ptr);一样。 - Ted Lyngmo
3
如果perm_ptr是一种自定义的unique_ptr,具有一个operator=(T*&&)运算符,以便在调用时清楚地表明所有权从原始指针转移到拥有指针,那么我实际上可以看到这种情况可能是故意的。这是对语法的滥用,但类似的先例已经存在:https://dev59.com/M2gMtIcB2Jgan1znQPjp#mSPtnYgBc1ULPQZFbQ8a - user4442671
2
如果perm_ptr也是一个原始指针,那么在这里使用std::move()就没有意义。但是,如果perm_ptr是某种具有重载的operator=的对象,该操作符接受原始指针,则std::move()可能是有意义的,因为它允许在复制后重置原始指针。 - Remy Lebeau
1个回答

3

正如评论所说,如果perm_ptr的类型是原生指针类型,则此移动操作毫无意义。

然而,可以为perm_ptr定义一种类型,使这个语法具有一定的意义。无论它是否有用,都很值得商榷,因为它会导致不直观和非常规的代码。

它涉及到定义一个只接受指针RValue的赋值运算符。像这样:operator=(T*&& p);

例如,可以使用它来确保没有人在不经意间将原始指针分配给最终将调用delete的某些内容,而没有故意这样做。

它还可用于将指针重置为nullptr(或其他某个值)作为赋值的一部分。

#include <utility>

template<typename T>
struct my_unique_ptr {
  ~my_unique_ptr() {
    if(ptr_) delete ptr_;
  }

  my_unique_ptr& operator=(T*&& p) { 
    ptr_ = p; 
    p = nullptr;
    return *this; 
  }

private:
  T* ptr_ = nullptr;
};

int main() {
    my_unique_ptr<int> perm_ptr ;

    int* ptr = new int;

// all good.
    owning_ptr = std::move(ptr);

// compile error!
    owning_ptr = ptr;  

}

需要明确的是:这只是一个例子,可能会导致OP呈现的程序有意义且有意义。我不主张使用这种技术。即使这是一个好主意,它仍然会充满注意事项和陷阱,这些内容并未在本答案中涵盖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接