vectorにauto_ptrをpush_backできない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
N11

vectorにauto_ptrをpush_backできない

#1

投稿記事 by N11 » 6年前

下のコードは、コンパイルに失敗してしまいます。

コード:

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()の時は”コピー コンストラクターが使用できない”と表示されるのかを教えて下さい。

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: vectorにauto_ptrをpush_backできない

#2

投稿記事 by tk-xleader » 6年前

 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も内部ではこういうことになっているはずです。

N11

Re: vectorにauto_ptrをpush_backできない

#3

投稿記事 by N11 » 6年前

ありがとうございます。
教えていただいたとおり、コピーコンストラクタの引数が非constの参照になっていました。

閉鎖

“C言語何でも質問掲示板” へ戻る