VS2008でauto_ptrをメンバ変数にもつクラスをvectorに入れる(

std::auto_ptr をメンバ変数に持つクラスを std::vector に入れたい、そんなことありますよね?

VS2010 ならば

#include "stdafx.h"
#include <memory>
#include <vector>

class A {};

class B {
private:
	std::auto_ptr<A> a_;
public:
	B( void ) : a_( new A() ) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<B> bs1;
	bs1.push_back( B() ); // Bのコピーコンストラクタでエラー

	std::vector<B> bs2;
	bs2 = bs1;            // ここもBのコピーコンストラクタでエラー

	return 0;
}

なんてコードで問題ありませんが、2008だと上記コメント部分でコンパイルエラーとなります

B( const B& other ) : a_( other.a_ ) {} // otherはconstなので所有権委譲ができない

B::a_ の型を std::tr1::shared_ptr にすることでこの問題は解決しますが、なにせ shared_ptr は重いし遅い。
※一般用途では shared_ptr で問題ないパフォーマンスです。ただ、インスタンスが数百万単位になると馬鹿にならない。

では boost::ptr_vector ならばどうなるかというと

#include "stdafx.h"
#include <memory>
#include <boost/ptr_container/ptr_vector.hpp>

class A {};

class B {
private:
	std::auto_ptr<A> a_;
public:
	B( void ) : a_( new A() ) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
	boost::ptr_vector<B> bs1;
	bs1.push_back( new B() ); // ここは通る

	std::vector<B> bs2;
	bs2 = bs1;                // ここで B のコピーコンストラクタでエラー

	return 0;
}

ということになってしまいます。

ということで続きは明日