给定以下代码:
#include <vector>
#include <iostream>
struct number {
int n{666};
};
int main()
{
std::vector<number> vec;
std::cerr << vec.size() << std::endl;
number n;
vec.push_back(n);
std::cerr << vec.size() << std::endl;
auto b = std::move(vec.front());
std::cerr << "b: " << b.n << std::endl;
std::cerr << vec.size() << std::endl;
}
我得到以下输出:
0
1
b: 666
1
最后的1
不应该是0
吗?
一旦您使用了前面的值,并且想要删除它,您将需要从向量中erase
它。 我将不讨论front()
返回一个ref,因为0x5453提到了这一点。 但是没有理由在那里使用std::move
-所做的只是将值强制转换为rvalue引用-实际上它自己并不“移动”任何东西。
#include <vector>
#include <iostream>
struct number {
int n{666};
};
int main()
{
std::vector<number> vec;
std::cerr << vec.size() << std::endl;
number n;
vec.push_back(n);
std::cerr << vec.size() << std::endl;
// Since this is a ref, and your struct is simple - just copy
auto b {vec.front()};
// Now remove the element
vec.erase(vec.begin());
std::cerr << "b: " << b.n << std::endl;
std::cerr << vec.size() << std::endl;
}
std::move
甚至不知道它移动的东西在容器中。 矢量拥有的内存块仍然在那里,只是处于未指定的状态。 由你来管理矢量。