c++ - C++ 对象没有得到 std::moved 吗?

标签 c++ c++14 move

我得到以下代码:( Code Live: C++ Shell )

class Worker
{
public:
  Worker (std::string name):_name (name) {};

  Worker (const Worker & worker):_name (worker._name)
  {  std::cout << _name << " got copied!" << std::endl; }

  Worker (Worker && other):_name (other._name)
  {  std::cout << _name << " got moved!" << std::endl;  }

  ~Worker ()
  {  std::cout << _name << " got destroyed!" << std::endl;  }

  void changeName(std::string name)
  {  this->_name = name;  }

private:
  std::string _name;
};

class Factory
{
public:
  Factory ()
  {  std::cout << "Factory got created!" << std::endl;  }

   ~Factory ()
  {  std::cout << "Factory got destroyed!" << std::endl;  }

  void addWorker (Worker & worker)
  {  this->workers.push_back (std::move (worker));  }

  Worker & getLastWorker ()
  {  this->workers.back ();  }

private:
  std::vector < Worker > workers;
};
int main ()
{
  auto factory = std::make_unique < Factory > ();
  Worker w1 ("Bob");
  factory->addWorker (w1);
  Worker & workerRef = factory->getLastWorker ();
  //workerRef.changeName("Mary");

  return 0;
}

我有一个 Factory 存储在它的 Workers vector 中。当我运行 main() 时,我得到以下输出:

Factory got created!
Bob got moved!
Bob got destroyed!
Factory got destroyed!
Bob got destroyed!

但我不明白为什么 Bob 被摧毁了! 出现了两次,因为我认为 Worker w1 被 move 到 vector workersFactory 中。此外,如果您在 workerRef.changeName("Mary"); 中发表评论,代码会因 Segmentation fault 而崩溃。

我用 C++ 编写代码已经一个月了,在这里真的很吃力。我已经用谷歌搜索了一段时间,但找不到提示,所以任何帮助都很棒!

最佳答案

move 只会 move 对象的内容(如果这样实现,它可以只是复制)。这并不意味着原始对象消失了,只是它的值可能发生了变化。

您的示例在两个地方创建了两个对象:

  1. Worker w1 ("Bob");
  2. this->workers.push_back (std::move (worker));

第二个偷走了第一个的胆量(无论如何,从表面上看),但第一个还活着。任何有生命的对象都会在其生命周期结束时调用其析构函数(对于 w1,它是 main 的结束)。

关于c++ - C++ 对象没有得到 std::moved 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46887032/

相关文章:

c++ - 由于捕获缓冲区,OpenCV VideoCapture 滞后

c++ - NetBeans C++ - 在代码中使用调试检查编译的方法?

c++ - 处理大文件

c++ - 将参数包转换为 vector

java - 递归 move 和重命名文件和文件夹的 ANT 任务

javascript - 向下和向上滚动时用 float block

c++ - 内存编辑: Can't get right address (3 offsets)

c++ - 如何使用算法将一个容器中的对象中的成员复制到另一个容器中?

c++ - 如何测试 get_children() 返回的小部件的类型?

mouse - AutoHotkey 按下按钮将光标向左 move