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 ?
unique_ptr当您想要转移所有权时,按值传递(或任何智能指针)。
通过引用传递一个不会改变所有权,如果函数不改变所有权,也许它不需要智能指针作为参数(裸指针通常更好)。
更直接地回答您的问题:当您按值传递时,形式参数 ( other) 是从实际参数移动构造的。移动构造函数负责转移所有权。然而,当您通过引用传递时,形式参数是对现有对象的引用 - 不会创建新对象,因此永远不会发生移动构造函数。