Это очень простой вопрос, но я не могу понять, что здесь происходит. Рассмотрим фрагмент кода:Какой 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 имеет только два вариант:
void push_back (const value_type& val);
void push_back (value_type&& val);
Это не может вызвать второй вариант, так как временный aCell
объекта является объектом именующим. Если он вызывает первый вариант, то он нажимает временно объект aCell
, который разрушается, когда цикл завершается.
Любое объяснение того, что происходит под капотом этого, ценится.
РЕДАКТИРОВАТЬ: Код фиксированной из-за ошибки указал, Сэм Varshavchik и songyuanyao
[Новый элемент инициализируется как копия 'value'.] (Http://en.cppreference.com/w/cpp/container/vector/push_back). – user657267
Ahh, поэтому объект push_back в первом варианте не является созданным объектом, а скорее объектом, созданным конструктором копирования аргумента? – TuanDT
Упс nvm, я неправильно понял. Сожалею. –