std::vector<T>::insert 和 std::move_iterator<T> 它们如何协同工作?

Art*_*zuk 4 c++ c++11

我对此不太确定,所以请解释一下它是如何工作的。

让我们考虑以下代码。

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()区分“正常”和“移动”迭代器?

j6t*_*j6t 5

[] 的实现是否std::vector<T>::insert()区分“正常”和“移动”迭代器?

不。“魔法”发生在move_iterator::operator*():它返回一个右值引用。因此,当insert()填充新分配的元素时,它更喜欢移动构造函数,因此会移动值。

所以,是的,您可以确定*(v.begin()+1)操作后它已被移动。