ページ 11

vectorにauto_ptrをpush_backできない

Posted: 2014年2月19日(水) 01:55
by N11
下のコードは、コンパイルに失敗してしまいます。

コード:

auto_ptr<int> pw1(new int(1));

vector<auto_ptr<int>> v;
v.push_back(pw1);
エラーコードは、"error C2558: class 'std::auto_ptr<int>' : コピー コンストラクターが使用できないか、'explicit' として宣言されています。" と表示されます。

しかし、下のコードのコンパイルは成功します。

コード:

void func(const auto_ptr<int> p){}

auto_ptr<int> pw1(new int(1));
func(pw1);
なぜ、push_back()の時は”コピー コンストラクターが使用できない”と表示されるのかを教えて下さい。

Re: vectorにauto_ptrをpush_backできない

Posted: 2014年2月19日(水) 02:43
by tk-xleader
 vector::push_backと同じ理由で次のコードはエラーになります。

コード:

#include<memory>

using std::auto_ptr;

void func(const auto_ptr<int>& ptr){
	auto_ptr<int>ptr2(ptr);
}

int main(){
	auto_ptr<int>ptr(new int);
	func(ptr);
}
 というのも、auto_ptrのコピーコンストラクタはコピー元を破壊する(所有権を”むしりとる”)ので、引数がconst&ではなく単なる&になっているため、const&なオブジェクトを渡すことができないからです。push_backも内部ではこういうことになっているはずです。

Re: vectorにauto_ptrをpush_backできない

Posted: 2014年2月19日(水) 11:35
by N11
ありがとうございます。
教えていただいたとおり、コピーコンストラクタの引数が非constの参照になっていました。