2012-08-05 101 views
2

我得到」「std :: vector類型的非常量引用的無效初始化。&「從類型的右值」的std ::載體」錯誤最後最後在第二PARAM傳遞merge_sort(右)「類型'std :: vector'的右值的非常量引用類型'std :: vector&'的無效初始化錯誤

left_merged = merge_sort(left); 
// right_merged = merge_sort(right); 
return merge(left_merged, merge_sort(right)); 

下面是函數聲明:

vector<int> merge_sort(vector<int>& vec) 
vector<int> merge(vector<int>& left, vector<int>& right) 

我一直在讀rvalue是一個臨時對象的理論,如果它不在in中使用,它會被銷燬itializer或分配給一個變量,但我真正想要的是一個快速和骯髒的解決方案,可以調用參數中的函數。

任何快速解決方案?

謝謝!

回答

3

更改參數類型,既可以const vector<int>&(const引用),或簡單地vector<int>(由值)。

如果函數內部沒有對參數進行任何更改,則首選第一個選項(const引用)。否則第二個(按值)。如果在函數內部立即複製參數,然後在忽略原始的情況下操作副本,則可以通過值獲取參數,跳過副本並直接使用參數。

3

在此呼籲:

return merge(left_merged, merge_sort(right)); 

第二個參數是一個臨時的,你不能兵非const引用到一個臨時的。您需要

vector<int> merge(vector<int>& left, const vector<int>& right); 

,可能(雖然它不會影響這個特殊的例子),

vector<int> merge(const vector<int>& left, const vector<int>& right); 

如果你發現自己做的函數中的參數拷貝,你可以把他們的價值。例如,如果你正在複印的第二個參數,然後更喜歡這種:

vector<int> merge(const vector<int>& left, vector<int> right);. 
相關問題