考虑下面的代码:
struct foo {
std::string id;
};
int main() {
std::vector<foo> v;
{
foo tmp;
v.push_back(std::move(tmp));
}
}
LIVE DEMO http://coliru.stacked-crooked.com/a/dd5ab085542c15a7
在这段代码中演示了:
- 类的默认构造函数
foo
将被调用来构造对象tmp
.
- 类的移动构造函数
foo
将在声明中调用v.push_back(std::move(tmp));
.
- 的析构函数
class foo
将被调用两次。
问题:
- 为什么移出对象的析构函数被调用两次?
- 从真正被移动的物体中移动了什么?
为什么移动对象的析构函数被调用两次?
第一个析构函数销毁移出的tmp
当它第一次超出范围时}
in main()
。第二个析构函数破坏了移动构造的foo
那你push_back
'd into v
在......的最后main()
when v
超出范围。
从真正被移动的物体中移动了什么?
编译器生成的移动构造函数 move-constructsid
,这是一个std::string
。的移动构造函数std::string
通常获取存储实际字符串的移出对象中的内存块的所有权,并将移出对象设置为有效但未指定的状态(实际上,可能是空字符串)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)