为什么调用从对象移动的析构函数?

时间:2014-07-05 01:43:32

标签: c++ c++11 move

考虑以下代码:

struct foo {
  std::string id;
};

int main() {
  std::vector<foo> v;

  {
    foo tmp;
    v.push_back(std::move(tmp));
  }
}

LIVE DEMO

在展示的代码中:

  1. 将调用类foo的默认构造函数来构造对象tmp
  2. 将在foo语句中调用类v.push_back(std::move(tmp));的移动构造函数。
  3. class foo的析构函数将被调用两次。
  4. 问题:

    1. 为什么从对象移动的析构函数被调用两次?
    2. 从正在移动的对象移动的是什么?

1 个答案:

答案 0 :(得分:2)

  

为什么要移动对象的析构函数被调用两次?

第一个析构函数会在tmp中的第一个}超出范围时销毁main()。当foo超出范围时,第二个析构函数会在push_back结束时销毁v main()移动构造的v

  

从正在移动的对象移动了什么?

编译器生成的移动构造函数move-constructs id,它是std::stringstd::string的移动构造函数通常获取存储实际字符串的移动对象中的内存块的所有权,并将移动的对象设置为有效但未指定的状态(实际上,可能是空字符串)