c++11
新しい標準では、Allocator タイプのオブジェクトに機能が追加されました。
追加された機能の 1 つは、アロケーターが定置建設 (別名) を許可するようになったことです。コピー/移動以外のコンストラクターを使用したオブジェクトの構築。
template< class U, class... Args > void construct( U* p, Args&&... args );
標準では、STL コンテナーがこの新しい機能を使用する必要があることが保証されています。これにより、デフォルトで初期化できないオブジェクトをデフォルトで初期化する目的だけで、独自のアロケーターを実装できます。
それは最も美しい解決策ではありませんが、あなたのボートを浮かせるものは何でも..
c++03
アロケータは、オブジェクトの初期化のその部分とは何の関係もありません。唯一の目的はメモリの割り当て/割り当て解除であり、参照している初期化のタイプは他の場所で行われます。
アロケータが呼び出す唯一のコンストラクタは、 placement-newを実行するよう誰かに要求されたときにcopy-constructorであり、そのcopy-ctorに渡された値はすでに別の場所で確立されています。
要約すると; いいえ、アロケーターを使用できないため、この特定の問題を解決してください。
std::vector でdefault-ctorを使用する必要があるのはいつですか?
std::vector
次の 2 つの状況で保持されている型のデフォルト コンストラクターのみを使用します。
std::vector
適切なコンストラクターのオーバーロードで要素の数を指定しますが、既定値は指定しません
コンテナー内のオブジェクトの数を使用std::vector<T>::resize (n)
して増やします ( member-functionに 2 番目の引数を指定していないことに注意してください)
上記を念頭に置いて、値XのN 個の要素を含むように初期化するなど、オブジェクトにデフォルトのコンストラクターを提供することなく、コンテナーを使用して多くのことを行うことができます。
struct A{
A (A const& a)
: value_ (a.value_)
{ }
A (int value)
: value_ (value)
{}
int value_;
};
int
main (int argc, char *argv[])
{
std::vector<A> vec (5, A(1)); // initialize vector with 5 elements of A(1)
vec.push_back (A(3)); // add another element
}
でもどうしてもvec.resize()が使えるようになりたい!?
次に、 2 つ、3 つ、4 つのオプションがあります。
アロケーターを使用するC++11アプローチを採用する
オブジェクトにデフォルトのコンストラクターを持たせる
オブジェクトを含むオブジェクトをデフォルトで初期化することだけを目的とする非常に薄いラッパーでオブジェクトをラップします(状況によっては、これを言う方が簡単かもしれません)
「boost::optional で [オブジェクト] をラップすると、実際には任意の型にデフォルトの ctor が与えられます」 - @ Xeo