c ++向量push_back移动新元素

时间:2019-08-12 00:59:05

标签: c++ vector

在末尾添加元素 在向量的最后一个元素之后的向量的末尾添加一个新元素。 val的内容被复制(或移动)到新元素。

嗨,上面的内容来自http://www.cplusplus.com/reference/vector/vector/push_back/

我对“ move”一词有些困惑。我理解右值引用和左值引用。

例如,

vector<int> source = {1,2,3};
vector<int> copy;
copy.push_back(source[0]);
cout<<source[0];   // why it doesn't throw error since source[0] is moved to copy ?

因为source [0]是右值,所以push_back实际上移动了source [0]而不是复制它。 那么在使用该运算符之后,对source [0]的访问仍然有效吗?为什么?

2 个答案:

答案 0 :(得分:4)

copy.push_back(source[0]);

这会将const左值引用传递给函数。因此,不允许std :: vector对其进行触摸;并被强制复制。 这将使source [0]有效。

copy.push_back(std::move(source[0]));

将一个右值传递给该函数。然后可以将其传递到对象的构造函数中并移动。

但是要跟进;尝试使用已移动的对象通常不会对std对象产生错误;因为它应该使对象处于“空”状态。您还使用了int,它不是对象,因此无法真正移动。

答案 1 :(得分:0)

  

因为源[0]是右值

否,表达式source[0]lvalue,因为向量的索引运算符[]返回元素类型的左值引用。参见this link

  

为什么将source [0]复制到副本后它不会引发错误?

否,移动对象的行为是用户定义的。您可以使其抛出错误,也可以使操作无声地失败,等等。对于标量(在您的情况下,int而言),移动构造通常会使原始对象保持不变。

相关问题