1

ウィキペディアのauto_ptrは、「STLコンテナーを含むauto_ptrを使用して、コンテナーがさらに変更されるのを防ぐことができる」と述べています。次の例を使用しました。

auto_ptr<vector<ContainedType> > open_vec(new vector<ContainedType>);

open_vec->push_back(5);
open_vec->push_back(3);

// Transfers control, but now the vector cannot be changed:
auto_ptr<const vector<ContainedType> > closed_vec(open_vec); 

// closed_vec->push_back(8); // Can no longer modify

最後の行のコメントを外すと、g++は次のようにエラーを報告します

t05.cpp:24: error: passing ‘const std::vector<int, std::allocator<int> >’ 
as ‘this’   argument of ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) 
[with _Tp = int, _Alloc = std::allocator<int>]’ discards qualifiers

このベクターの所有権を譲渡した後、変更できなくなったのはなぜですか?

どうもありがとう!

4

2 に答える 2

4

closed_vecポインタはタイプを保持しますconst vector<ContainedType>。タイプがconstであるため、としても定義されconstていない(つまり、内部データを変更しない)メソッドを呼び出すことはできません。ベクトルを変更するため、当然push_back非constであるため、constポインターで呼び出すことはできません。それは実際には何の関係もありませんauto_ptr、あなたは通常のポインタで同じことを達成することができます:

vector<ContainedType>* open_vec = new vector<ContainedType>();
open_vec->push_back(5);
open_vec->push_back(3);

const vector<ContainedType>* closed_vec = open_vec;
closed_vec->push_back(8); // Fails
于 2010-06-15T19:59:00.773 に答える
1

はconstへのポインターであるため、ベクトルを変更することはできませんclosed_vec。そのため、コンパイラーはポインターを変更できません(ただし、ポインターを移動することはできます)。ベクトルの変更を許可するには、次のように宣言closed_vecします

auto_ptr<vector<ContainedType> > closed_vec(open_vec); // no const anymore
closed_vec->push_back(8); // this now works

ポインタを次のように宣言した場合

const auto_ptr<vector<ContainedType> > closed_vec(open_vec);

一方、ポインタを変更することはできますが、ポインタを移動することはできません。

于 2010-06-15T20:04:10.153 に答える