2016-08-01 56 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