これは非常に基本的な質問ですが、私はここで何が起こっているのかという論理を頭に浮かべているようです。コードスニペットを考える:どのC++ベクタpush_backがループ内で作成されたオブジェクトに対して呼び出されますか?
class Board{
private:
vector< vector<Cell> > allCells;
int bheight;
int bwidth;
public:
Board(int width = 10, int height = 10){
bheight = height; bwidth = width;
allCells.resize(width);
#loop for creating cell objects
for(int i = 0; i < width; i++){
allCells[i].reserve(height);
for(int j = 0; j < height; j++){
Cell aCell(i,j,0); #an object created inside a loop
allCells[i].push_back(aCell); #push it into a vector
}
}
}
このコードはallCells
が依然として適切な情報を格納する(ベクトルの)ベクターに、すべてのオブジェクトをコンストラクタを出た後、すなわち正常に動作します。私の質問は、これがどのように達成されたかです。定義によると、vector.push_backは2つだけのバリアントを持っています
void push_back (const value_type& val);
void push_back (value_type&& val);
一時的aCell
オブジェクトは左辺値オブジェクトであるので、それは第二の変形を呼び出すことはできません。最初のバリアントを呼び出すと、の一時的なオブジェクトaCell
がループを終了すると破棄されます。
これのフードの下で何が起こっているのかについての説明はありがたいです。
EDIT:それは最初のバリアントを呼び出すと、それは、ループが終了するときに破棄される一時的なオブジェクトaCell
を、プッシュによるエラーへの固定コードサムVarshavchikによって指摘されsongyuanyao
[新しい要素は 'value'のコピーとして初期化されます。](http://en.cppreference.com/w/cpp/container/vector/push_back)。 – user657267
ああ、最初の変種のpush_backオブジェクトは作成されたオブジェクトではなく、引数のコピーコンストラクタによって作成されたオブジェクトですか? – TuanDT
おっと、私は誤解しました。ごめんなさい。 –