【问题标题】:Is there any advantage to moving a pointer?移动指针有什么好处吗?
【发布时间】: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


【解决方案1】:

如 cmets 中所说,如果 perm_ptr 的类型是原始指针类型,则移动毫无意义。

但是,可以为perm_ptr 定义一个类型,使该语法有意义。它是否有用充其量是值得商榷的,并且会导致不直观和非常规的代码。

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

例如,这可以用来确保没有人不小心将原始指针分配给最终会在其上调用delete 而不是故意这样做的。

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

#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;  

}

100% 明确:这只是一个可能导致 OP 呈现的程序是有意和有意义的示例。我不提倡这种技术。即使这是一个好主意,它仍然充满了此答案未涵盖的警告和陷阱。

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2012-05-22
    • 2017-08-26
    • 1970-01-01
    • 2016-08-15
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多