式によって、配列内の各オブジェクトが初期化される場合と初期化されnew T[n]
ない場合がありT
ます。
を使用してこの初期化動作を再現するにはどうすればよいallocator
ですか?
struct Foo
{
int x;
Foo() : x(1)
{ }
};
Foo *p = new Foo[1];
assert(p[0].x == 1);
式によって、配列内の各オブジェクトが初期化される場合と初期化されnew T[n]
ない場合がありT
ます。
を使用してこの初期化動作を再現するにはどうすればよいallocator
ですか?
struct Foo
{
int x;
Foo() : x(1)
{ }
};
Foo *p = new Foo[1];
assert(p[0].x == 1);
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 にはほとんどの実装で機能するようなものがあることをぼんやりと思い出します。
ここでデザインと戦っていると思います。アロケーター インターフェイスは、コンテナーで使用するために設計されました。コンテナは初期化されていない要素を含まないように設計されているため、デフォルトの初期化には使用されません。