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; }
ということになってしまいます。
ということで続きは明日