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

101010

考虑以下代码:

struct foo {
  std::string id;
};

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

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

LIVE DEMO

在这段代码演示中:

  1. class的默认构造函数foo将被用来构造object tmp
  2. foo在该语句中调用class的move构造函数v.push_back(std::move(tmp));
  3. 的析构函数class foo将被调用两次。

问题:

  1. 为什么从对象移出的析构函数被调用两次?
  2. 从真正被移动的对象移走了什么?
TC

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

第一析构函数破坏移动,从tmp它在第一次超出范围时}main()第二析构函数销毁,此举建造的foo,你push_back“d为v在年底main()v的范围熄灭。

从真正被移动的对象移走了什么?

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么要调用析构函数

为什么不调用析构函数?

为什么在此处调用析构函数以及在调用该对象析构函数后如何调用对象成员函数?

为什么在调用luaL_error时未调用C ++对象析构函数?

为对象分配值时为什么调用构造函数和析构函数

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

为什么析构函数比构造函数调用得更多?

为什么在Friend函数中调用析构函数

为什么在声明指向对象的指针时不调用析构函数

为什么分配操作完成后调用对象的析构函数

为什么不按相反的顺序对对象数组调用析构函数?

为什么QSharedPointer <T> ::: create不完整对象的调用析构函数?

C ++为什么在堆栈中构造完对象后立即调用析构函数?

什么时候调用constinit对象的析构函数?

为什么不调用继承类的析构函数?

为什么在父类之前调用子类的析构函数?

为什么代码两次调用析构函数?

为什么我的类析构函数立即被调用?

为什么在执行复制之前调用析构函数?

为什么要调用派生类的析构函数?

为什么在构造时调用C ++类的析构函数?

为什么析构函数被调用两次?

为什么析构函数调用两次表单?

为什么在复制分配期间调用析构函数?

为什么 C++ 线程多次调用析构函数?

为什么在“返回 0”后调用析构函数?

为什么析构函数可以更改常量对象的状态?

为什么此析构函数不必删除类对象?

当将对象作为参数传递时,为什么要调用析构函数但不调用构造函数?