在以下代码中,断言foo失败:
void bar (std::shared_ptr<int> && value) {
}
void foo () {
auto ptr = std::make_shared<int>(5);
bar(std::move(ptr));
assert(ptr == nullptr);
}
Run Code Online (Sandbox Code Playgroud)
调用后,共享指针仍然指向值5 bar.我期望调用bar使用移动语义,ptr留空.
我理解的缺陷在哪里?
基本上,std::move()只是一个演员.
改变bar()以查看您想要的结果.
void bar (std::shared_ptr<int> && value)
{
std::shared_ptr<int> v{std::move(value)};
}
Run Code Online (Sandbox Code Playgroud)
执行实际移动后,指针将变为null.std::move本身不会移动任何东西.它只是可以将命名对象传递ptr给rvalue-reference-expecting函数.
由于您实际上并未在该函数内(或其他任何位置)移动任何内容,因此指针保持不动.
这样做(举个例子)
void bar (std::shared_ptr<int> && value) {
std::shared_ptr<int> another_ptr(std::move(value));
}
Run Code Online (Sandbox Code Playgroud)
你会看到原来的指针移动了.