template<class Iterator>
class move_iterator;
template<class It>
move_iterator<It> make_move_iterator(const It &it);
<move_iterator>является адаптером итератора с тем же поведением, что и базовый итератор, за исключением того, что его оператор отсчета неявно преобразует значение, возвращаемое оператором отсчета отсчета от базового итератора, в ссылку на значение r:<boost::move(*underlying_iterator)>Это итератор считывания, но он может иметь характеристики случайного доступа.
<move_iterator>Это очень полезно, потому что некоторые общие алгоритмы и функции вставки контейнеров могут быть вызваны итераторами перемещения, чтобы заменить копирование движением. Например:
#include <boost/move/core.hpp>
#include <boost/move/traits.hpp>
class movable
{
   BOOST_MOVABLE_BUT_NOT_COPYABLE(movable)
   int value_;
   public:
   movable() : value_(1){}
   
   movable(BOOST_RV_REF(movable) m)
   {  value_ = m.value_;   m.value_ = 0;  }
   movable & operator=(BOOST_RV_REF(movable) m)
   {  value_ = m.value_;   m.value_ = 0;  return *this;  }
   bool moved() const 
   {  return !value_; }
   int value() const 
   {  return value_; }
};
namespace boost{
template<>
struct has_nothrow_move<movable>
{
   static const bool value = true;
};
}  
<movable>Объекты могут перемещаться из одного контейнера в другой с помощью итераторов перемещения и операций вставки и назначения. в
#include <boost/container/vector.hpp>
#include "movable.hpp"
#include <cassert>
int main()
{
   using namespace ::boost::container;
   
   vector<movable> v(10);
   assert(!v[0].moved());
   
   vector<movable> v2( boost::make_move_iterator(v.begin())
                     , boost::make_move_iterator(v.end()));
   assert(v[0].moved());
   assert(!v2[0].moved());
   
   v.assign( boost::make_move_iterator(v2.begin())
           , boost::make_move_iterator(v2.end()));
   assert(v2[0].moved());
   assert(!v[0].moved());
   return 0;
}