2016-08-01 34 views
1

我宣布这样的结构:推到结构的载体,其向量的元素

struct Point{ 
    double x,y; 
    Point(){} 
    Point(double xx,double yy): x(xx),y(yy){} 
}; 

而且我试图填补这样的载体:

vector<Point> s(1); 
Point tmp(1,2); 
s[0]=tmp; 
s.push_back(s[0]); 

不幸,当我显示s [1]的内容时,这样做会给我一个错误的答案,但s.push_back((Point)s[0])会导致期望的答案(例如s [0]的副本)。

是什么 s.push_back(s[0])s.push_back((Point)s[0]),说明这一点differennce之间的区别?

是否有任何自动类型转换或引擎盖下的东西?通过const引用(和由右值引用的其它过载)

+1

's.push_back((Point [0]))'没有意义,'Point'是一种类型。 – Borgleader

+2

什么错误/正确的答案是什么? – Svalorzen

+1

'vector s(2,Point(1,2))'会好得多。 – DimChtz

回答

3

push_back取参数,所以

s.push_back(s[0]); 

使用第一元件的左值参考,但是,如果push_back容量足够大不重新分配可能。因此,从s[0]中提取的参考文献仍悬而未决,不再可行。

在另一侧

s.push_back((Point)s[0]); 

创建临时,然后s[0]不再使用,允许在vector推有效Point

+0

在帖子中OP使用&s [0]的位置?你说的是真的,但是OP没有这样做,所以你的答案是AFAICT无关紧要。 – Borgleader

+2

@Borgleader它不是。我知道了。 's [0]'被const引用传递给'push_back',但'push_back'可以在调整大小时重新分配序列床,使*引用*悬空。我承认最后一句话没有任何意义(我希望这个评论能够)。 – WhozCraig

+0

@WhozCraig哦,我明白了,现在有道理。我一直在想,即使你尝试过,也不能将T *推回到T的向量中,并且没有看到它也适用于引用。接得好。 – Borgleader