考虑以下代码:
struct foo {
std::string id;
};
int main() {
std::vector<foo> v;
{
foo tmp;
v.push_back(std::move(tmp));
}
}
在这段代码演示中:
foo
将被用来构造object tmp
。foo
在该语句中调用class的move构造函数v.push_back(std::move(tmp));
。class foo
将被调用两次。问题:
为什么移动对象的析构函数被调用两次?
第一析构函数破坏移动,从tmp
它在第一次超出范围时}
在main()
。第二析构函数销毁,此举建造的foo
,你push_back
“d为v
在年底main()
时v
的范围熄灭。
从真正被移动的对象移走了什么?
编译器生成的move构造函数move-constructs id
,它是一个std::string
。std::string
通常,move构造函数获取存储实际字符串的源对象中的内存块的所有权,并将源对象设置为有效但未指定的状态(实际上,可能是空字符串)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句