3

std::auto_ptrで演算子[]が許可されないのはなぜですか?

#include <iostream>

using namespace std ;

template <typename T>
void foo( T capacity )
{
    auto_ptr<T> temp = new T[capacity];

    for( size_t i=0; i<capacity; ++i )
        temp[i] = i; // Error
}

int main()
{
    foo<int>(5);
    return 0;
}

Microsoft Visual C++ 2010 でコンパイルされています。

エラー:エラー C2676: バイナリ '[' : 'std::auto_ptr<_Ty>' は、この演算子または事前定義された演算子に受け入れられる型への変換を定義していません

4

4 に答える 4

11

その理由は、の代わりにをauto_ptr使用してコンテンツを解放するため、(で構築された)ヒープ割り当て配列の処理には適さず、。で構築された単一のヒープ割り当て配列の処理にのみ適しているためです。deletedelete[]auto_ptrnew[]new

サポートoperator[]すると、開発者は配列にそれを使用するようになり、実際にはサポートできないのに、型が配列をサポートできるという印象を誤って与えることになります。

スマートポインターのような配列クラスが必要な場合は、boost::scoped_arrayを使用します。

于 2011-03-17T23:13:04.977 に答える
2

std::auto_ptr配列での使用を意図していないためです。

その上、あなたのサンプルでは

std::auto_ptr<T> temp = new T(capacity); // T=int, capacity=5

実際にシングル を割り当て、intで初期化しcapacityます。あなたが意図したように、整数の配列を作成しません。

于 2011-03-17T23:12:30.983 に答える
1

auto_ptr単一の要素へのポインタを保持するように設計されているため。破壊に使用しますdelete(具体的には使用しません)。delete[]

あなたの例は、あなたが思っていることを(私は思うに)やっていない。または、少なくとも名前の容量は誤解を招く可能性があります。これは、単一の要素のみを割り当てている(そして容量`の値をそれに割り当てている)ためです。forループには意味がありません。

于 2011-03-17T23:13:41.137 に答える
1

auto_ptrその他のスマートポインタは、単一のオブジェクトへのポインタを格納することのみを目的としています。これは、配列へのポインタを格納する場合に必要となるdelete、ではなく、デストラクタで使用するためです。delete[]

オブジェクトの配列をスマートポインタでラップする必要がある場合、標準ライブラリは何も提供しません。ただし、Boostはscoped_array、と同様に動作し、std::auto_ptrによって作成されたオブジェクトの配列を保持するように作成されたを提供しnew[]ます。

于 2011-03-17T23:17:37.703 に答える