1

式によって、配列内の各オブジェクトが初期化される場合と初期化されnew T[n] ない場合がありTます。

を使用してこの初期化動作を再現するにはどうすればよいallocatorですか?

struct Foo
{
    int x;
    Foo() : x(1)
        { }
};

Foo *p = new Foo[1];
assert(p[0].x == 1);
4

1 に答える 1

3

C++03 では、アロケーター インターフェイスは、オブジェクトを初期化する 1 つの方法しか認識していません。それは、別のオブジェクトからコピーすることです。C++11 には他にもあります。

デフォルトの初期化を求めています。これは、(ほぼ)「何もしないか、デフォルトのコンストラクターを呼び出す」ことを意味します。アロケーター インターフェイスは、C++03 では後者を行うことができません。

次のように書けると思います。

T *ra = allocator.allocate(1);
if (!is_pod<T>::value) {
    // in C++03
    allocator.construct(ra, T());
    // in C++11
    allocator.construct(ra);
}

ただし、そのis_podテストは間違っている可能性があります。デフォルトの初期化で何も行われない正確な条件については、標準を確認してください。明らかis_podに C++03 には存在しませんが、Boost にはほとんどの実装で機能するようなものがあることをぼんやりと思い出します。

ここでデザインと戦っていると思います。アロケーター インターフェイスは、コンテナーで使用するために設計されました。コンテナは初期化されていない要素を含まないように設計されているため、デフォルトの初期化には使用されません。

于 2012-07-24T08:28:04.997 に答える