【发布时间】:2018-11-25 07:17:54
【问题描述】:
我知道size() 和empty() 不需要前置条件,因此可以在移出的对象上调用并返回正确的结果。但我不明白结果背后的理论。
std::vector<std::string> v = {"a", "b"};
std::string x = std::move(v[0]);
std::cout << x << std::endl; // a
std::cout << v.size() << std::endl; // 2
std::cout << v.empty() << std::endl; // 0, false
auto y = std::move(v);
std::cout << v.size() << std::endl; // 0
std::cout << v.empty(); // 1, true
结果显示,如果你移动一个元素,向量的大小不会改变。但是如果你移动整个向量,它就会变成空的。这是有道理的,但我觉得需要更多解释,以便我以后可以处理类似的情况。
【问题讨论】:
-
嗯,这是UB。
-
这并没有解决问题,但是您真的需要
std::endl需要的额外内容吗?'\n'结束一行。 -
如果你搬了整栋房子,你会留下一块空地,但如果有人搬出那栋房子的公寓,公寓还在。
-
@Vivick:你有一些额外的保证,比如
std::vector。来自doc“移动后,其他保证为空()。” -
@codekaizer 搬家的方法是搬家;这比遍历每个房间,然后将其中的每件物品搬到路上的新房子还要快。不过,在这个类比中 - 它不像搬家,更像只是改变你的道路名称......一切都保持原样,但它只是被称为不同的东西
标签: c++ vector move move-semantics