[英]c++ Vector push_back move new element
在末尾添加元素在向量的当前最后一个元素之后,在向量的末尾添加一个新元素。 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]的访问仍然有效吗? 为什么?
copy.push_back(source[0]);
这会将const左值引用传递给该函数。 因此,不允许std :: vector对其进行触摸; 并被强制复制。 这将使source [0]有效。
copy.push_back(std::move(source[0]));
将一个右值传递给该函数。 然后可以将其传递到对象的构造函数中并移动。
继续跟进; 尝试使用已移动的对象通常不会对std对象产生错误; 因为它应该使对象处于“空”状态。 您还使用了int,它不是对象,因此无法真正移动。
因为source [0]是右值
不,表达式source[0]
是lvalue
,因为向量的索引运算符[]
返回元素类型的lvalue引用。 看到这个链接 。
为什么由于source [0]被移动到copy而不引发错误?
不,移动对象的行为是用户定义的。 您可以使其抛出错误,也可以使操作无声地失败,等等。对于标量(在您的情况下为int
),移动构造通常会使原始对象保持不变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.