在末尾添加元素 在向量的最后一个元素之后的向量的末尾添加一个新元素。 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]的访问仍然有效吗?为什么?
答案 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
而言),移动构造通常会使原始对象保持不变。