繁体   English   中英

c ++向量push_back移动新元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM