移动语义意外行为

Bee*_*vik 3 c++ c++11

在以下代码中,断言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留空.

我理解的缺陷在哪里?

Cha*_*had 8

基本上,std::move()只是一个演员.

改变bar()以查看您想要的结果.

void bar (std::shared_ptr<int> && value)
{
   std::shared_ptr<int> v{std::move(value)};
}
Run Code Online (Sandbox Code Playgroud)


AnT*_*AnT 5

执行实际移动后,指针将变为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)

你会看到原来的指针移动了.