【发布时间】:2017-01-19 02:21:58
【问题描述】:
这是一个非常基本的问题,但我似乎无法理解这里发生的逻辑。考虑一下代码 sn-p:
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 对象是一个左值对象。如果它调用第一个变体,那么它会推送 temporary 对象aCell,该对象在循环终止时被销毁。
感谢任何解释这背后发生的事情。
编辑:由于 Sam Varshavchik 和 songyuanyao 指出的错误而修复了代码
【问题讨论】:
-
啊,所以第一个变体中的 push_back 对象不是创建的对象,而是由参数的复制构造函数创建的对象?
-
糟糕,nvm,我看错了。对不起。
-
这里发生的是未定义的行为和错误。使用哪个版本的
push_back()完全无关紧要。代码完全被破坏了。查看reserve()和resize()之间的区别,找出你真正需要使用的。 -
@Sam Varshavchik 抱歉,这是一个错字,我复制并粘贴,通过几个文件修复了 sn-p 代码以在询问之前进行实验,并且错误潜入。resize() 在我的原始代码中.
标签: c++ vector overloading lvalue rvalue