考虑以下代码:
struct foo {
std::string id;
};
int main() {
std::vector<foo> v;
{
foo tmp;
v.push_back(std::move(tmp));
}
}
在展示的代码中:
foo
的默认构造函数来构造对象tmp
。foo
语句中调用类v.push_back(std::move(tmp));
的移动构造函数。class foo
的析构函数将被调用两次。 问题:
答案 0 :(得分:2)
为什么要移动对象的析构函数被调用两次?
第一个析构函数会在tmp
中的第一个}
超出范围时销毁main()
。当foo
超出范围时,第二个析构函数会在push_back
结束时销毁v
main()
移动构造的v
。
从正在移动的对象移动了什么?
编译器生成的移动构造函数move-constructs id
,它是std::string
。 std::string
的移动构造函数通常获取存储实际字符串的移动对象中的内存块的所有权,并将移动的对象设置为有效但未指定的状态(实际上,可能是空字符串)