質問: 0) { return (pointer)( ::operator new( num * sizeof(T) ) ); } // 割当て済みの領域を初期化する void construct(pointer p, const T& value) { new( (void*)p ) T(value); } // メモリを解放する void deallocate(pointer p, size_type num) { ::operator delete( (void*)p ); } // 初期化済みの領域を削除する void destroy(pointer p) { p->~T(); } // アドレスを返す pointer address(reference value) const { return &value; } const_pointer address(const_reference value) const { return &value; } // 割当てることができる最大の要素数を返す size_type max_size() const throw() { return numeric_limits::max() / sizeof(T); } }; ```
回答: > > なぜ、キャストしているのでしょうか。 > > > それは引用サイトの管理者に聞いてみないことには判りません。元々placement newの引数はvoid *なので、私ならいちいちキャストしたりはしませんが。引数がvoid *だから、合わせた方が良いかな、と考えたのでしょうか。 > > デフォルトコンストラクターでは、不都合があるのでしょうか。 > > > 不都合というか、デフォルトコンストラクターで初期化した後で、改めてオブジェクトの値をコピーすることになり、二度手間になってしまいます。 コピーコンストラクタで実装していれば、 ``` construct(ptr, T()); construct(ptr, T(other)); construct(ptr, T(value)); construct(ptr, T(param1, param2)); ``` このように一つのメソッドでどのようなコンストラクタにも対応できますが、デフォルトコンストラクタ(引数なし)にすると、 ``` construct(ptr); // デフォルトコンストラクタならこれで済みますが construct(ptr); *ptr = T(other); // 改めて代入する必要が生じます construct(ptr); *ptr = T(value); construct(ptr); *ptr = T(param1, param2); ``` このようにコード量が増えてしまいます。また、場合によってはパフォーマンスにも影響するかもしれません。