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

Rob*_*rte 2 c++ rvalue unique-ptr

如果我运行代码

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";
}
Run Code Online (Sandbox Code Playgroud)

pm 的所有权转移给 foo 并且输出是

End foo
Myc Destructed
End main
Run Code Online (Sandbox Code Playgroud)

但如果将 foo 更改为

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

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

End foo
End main
Myc Destructed
Run Code Online (Sandbox Code Playgroud)

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

use*_*566 5

unique_ptr当您想要转移所有权时,按值传递(或任何智能指针)。

通过引用传递一个不会改变所有权,如果函数不改变所有权,也许它不需要智能指针作为参数(裸指针通常更好)。

更直接地回答您的问题:当您按值传递时,形式参数 ( other) 是从实际参数移动构造的。移动构造函数负责转移所有权。然而,当您通过引用传递时,形式参数是对现有对象的引用 - 不会创建新对象,因此永远不会发生移动构造函数。