std::unipue_ptrとstd::listその他の華麗な連携

VS2010すげえ! っていうか、C++0xが素敵っ!
下のようなのが書ける。

#include <list>
#include <memory>
#include <iostream>
#include <utility>
#include <algorithm>
using namespace std;

class Unit{
public:
	int pos_x,pos_y;
	Unit(int x, int y) : pos_x(x),pos_y(y){}
	virtual void Draw() = 0;
};

class A : public Unit{
public:
	A(int x, int y) : Unit(x,y){}
	virtual void Draw()
	{
		cout << "A!:" << pos_x << ":" << pos_y << endl;
	}
};
class B : public Unit{
public:
	B(int x, int y) : Unit(x,y){}
	virtual void Draw()
	{	
		cout << "B!:" << pos_x << ":" << pos_y << endl;
	}
};

int main(){
	list< unique_ptr<Unit> > unit_list;
	list< unique_ptr<Unit> >::iterator it;

	// 普通の生成
	unique_ptr<Unit> a(new A(3,3));  // OK

	// 普通の生成
	unique_ptr<Unit> b = unique_ptr<Unit>(new B(8,8)); // OK

	// =演算子でのコピー
	unique_ptr<Unit> a2 = a; // unique_ptrはコピーできないのでエラー

	// コピーコンストラクタでのコピー
	unique_ptr<Unit> a2(a); // unique_ptrはコピーできないのでエラー

	// std::move.コピーでなく移動をさせる。
	unique_ptr<Unit> a2 = move(a); // 移動なのでOK。aは空になり、インスタンスはa2に移動する。

	// std::swap.値の交換を行う。
	swap(a,b);//	交換もOK。中身が交換される。

	// デフォで連携してるので、勝手に所有権の移動が行われてunique_ptrが格納できる。
	unit_list.push_back( unique_ptr<Unit>(new A(1,2) ) );
	unit_list.push_back( unique_ptr<Unit>(new B(-4,3) ) );
	unit_list.push_back( unique_ptr<Unit>(new A(5,8) ) );

	for(it = unit_list.begin(); it != unit_list.end(); it++)
	{
		(*it)->Draw();
	}
	return 0;
}

もう生ポインタとか書かなくて良くね?