2013-10-30 63 views
1
//move the element 
void StrVec::push_back(string &&s) 
{ 
    chk_n_alloc(); 
    alloc.constructor(first_free++,std::move(s)); 
} 

alloc是分配器的對象。 不關心chk_n_alloc()。 我只想知道s已經是一個右值,爲什麼要調用std :: move將s給構造函數?代碼來自C++ primer 5th p545。爲什麼要調用std :: move將s傳遞給構造函數?

+0

右值沒有名稱。 's'有一個名字,「s」 –

回答

2

這是一個棘手的情況,s作爲右值引用傳遞,但是當您給它一個名稱時,它是一個左值,因此您必須將其移動,因爲您可能知道只是轉換爲右值引用。這仍然意味着參數必須作爲右值參考,因爲這可以防止非臨時數據被傳遞給它(除非它們被移動)

+0

變量's'不是(必然)有一個地址。但是's'的表達是一個左值。應該指出,表達式的類型和表達式的值類別是兩個正交的概念。 – MWid

相關問題