c++ 为什么使用右值引用时unique_prt的所有权不转移?

628mspwn  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(120)

如果我运行代码

class Myc {
  private:
    int m{0};

  public:
    Myc(int ii) : m{ii} {};
    ~Myc() { std::cout << "Myc Destructed\n"; }
    int getM() const { return m; }
};

void foo(std::unique_ptr<Myc> other) { std::cout << "End foo\n"; }

int main() {
  std::unique_ptr<Myc> pm = std::make_unique<Myc>(1);

  foo(std::move(pm));

  std::cout << "End main \n";
}

pm的所有权转移到foo,输出为

End foo
Myc Destructed
End main

但如果将foo更改为

void foo(std::unique_ptr<Myc> &&other) { std::cout << "End foo\n"; }

pm的所有权没有转移到foo,因为输出是

End foo
End main
Myc Destructed

我已经在clang和gcc中尝试过了。为什么使用右值引用时pm的所有权不转移到foo?

3bygqnnd

3bygqnnd1#

当你想转移所有权时,通过值传递unique_ptr(或任何智能指针)。
通过引用传递不会改变所有权,如果函数没有改变所有权,也许它不需要智能指针作为参数(空指针通常更好)。
更直接地回答您的问题:当你通过值传递时,形参(other)是从实际形参移动构造的。移动构造函数用于转移所有权。然而,当你通过引用传递时,形参是对现有对象的引用--没有新的对象被创建,所以移动构造函数永远不会发生。

相关问题