std::vector
のように初期化すると、A
のデフォルトのコンストラクタが呼び出されないのはなぜですか?なぜstd :: vectorを初期化しないのですか<T> Tを初期化しますか?
std::vector<A> vec; //Doesn't call constructor
vec.push_back(A(2)); //Calls constructor
私はこれを理解していない、誰かが非常に詳細に説明できますか?
std::vector
のように初期化すると、A
のデフォルトのコンストラクタが呼び出されないのはなぜですか?なぜstd :: vectorを初期化しないのですか<T> Tを初期化しますか?
std::vector<A> vec; //Doesn't call constructor
vec.push_back(A(2)); //Calls constructor
私はこれを理解していない、誰かが非常に詳細に説明できますか?
ベクトルv
を構築すると、A
オブジェクトが含まれないため(コンストラクタを呼び出す必要はありません)。 v
を設定すると、A
オブジェクトが明示的に構築され、これらのオブジェクトはベクトル内のメモリにコピーまたは移動されます。
A
オブジェクトはデフォルトで構築されていないので、デフォルトのコンストラクタは呼び出されません(= delete
とマークした場合、コードは正常にコンパイルされます)。あなたがvector<A>
を作成するとき
私は今理解しています。 – Adib
ライン:
std::vector<A> vec;
std::vector
がMないA
を初期化します。 A
のインスタンスは保持されますが、A
のインスタンスが作成されるように初期化されていません。
私はあなたの今のポイントを理解しており、plzに投票します – Adib
、あなただけA
要素の束を保持するのに十分なメモリと、基盤となるベクトルインフラストラクチャを初期化しますが、何のA
はその時点で初期化されませんので、ノーctorのが呼ばれるようになっています。
(一時的)A(25)
をプッシュバックすると、その一時的なctorから最初に作成された後、ベクター内部配列にコピー(または移動)され、破棄されます。
メッセージの出現の順序と時間について説明しています。
'A'ではなく' std :: vector'を初期化しているので、呼び出されません。 – Rakete1111
私はvがAではないことを知っていますが、ベクトルのタイプがAタイプの場合、どのようにベクトルvを作成するのですか?私の要点は、コンパイラがリソースをどのように割り当てるか、後で割り当てられるかどうかです。 – Adib
Aのオブジェクトを作成せずにsizeof(A)でクラスのサイズを問い合わせることができれば、コンパイラはAの配列を構築しなくても割り当てることができます。 –