2011-02-06 75 views
2

給出這樣的定義:矢量::在參考

vector<some_struct_t> lots_of_stuff; 

這​​返回引用的事實,此代碼對我來說很有意義:

some_struct_t & ref_element = lots_of_stuff.at(0); 

但是,這種代碼也編譯,似乎上班:

some_struct_t val_element = lots_of_stuff.at(0); 

非參考文件如何在這裏工作?是否調用了一個拷貝構造函數?爲什麼這個工作?

回答

0

類型T的引用僅僅是T型的,就像類型T的變量名的左值表達式是T.那麼的左值表達式,...

vector<T> v = ...; 
T a = ...; 
T b = a; 
T c = v.at(0); 

有多麼之間的差別不大b和c被初始化,因爲右側只是T類型的左值表達式,這導致了複製初始化。

我認爲你問這個問題的原因是你認爲引用本身就是一個對象類型,就像一個指針的類型是一個對象類型。但這種情況並非如此。表達式從來沒有有一個引用類型。引用類型僅用於將右值變爲左值表達式。表達式的類型是相同的。但其「價值類別」發生了變化。

6

非參考人員從返回的對象引用中複製副本。對象的更改不會應用於向量中的對象,如參考版本所做的那樣。

+0

+1。我希望你不介意我試圖在這方面多說一些。 – sellibitze 2011-02-06 08:23:24