我对此不太确定,所以请解释一下它是如何工作的。
让我们考虑以下代码。
std::vector<std::string> vec {};
void add (std::vector<std::string>&& v) {
using iter = std::vector<std::string>::iterator;
vec.insert (vec.end (),
std::move_iterator<iter> (v.begin ()),
std::move_iterator<iter> (v.end ()));
}
Run Code Online (Sandbox Code Playgroud)
所有元素都会v被移动吗?std::vector<T>::insert()对于范围版本需要第一个和最后一个迭代器,因此有了这样的代码,它如何知道v.begin()+1 也必须移动?的实现是否std::vector<T>::insert()区分“正常”和“移动”迭代器?
[] 的实现是否
std::vector<T>::insert()区分“正常”和“移动”迭代器?
不。“魔法”发生在move_iterator::operator*():它返回一个右值引用。因此,当insert()填充新分配的元素时,它更喜欢移动构造函数,因此会移动值。
所以,是的,您可以确定*(v.begin()+1)操作后它已被移动。
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |