如果我运行代码
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?
1条答案
按热度按时间3bygqnnd1#
当你想转移所有权时,通过值传递
unique_ptr
(或任何智能指针)。通过引用传递不会改变所有权,如果函数没有改变所有权,也许它不需要智能指针作为参数(空指针通常更好)。
更直接地回答您的问题:当你通过值传递时,形参(
other
)是从实际形参移动构造的。移动构造函数用于转移所有权。然而,当你通过引用传递时,形参是对现有对象的引用--没有新的对象被创建,所以移动构造函数永远不会发生。