2014-01-17 32 views
1

使用帶右值引用的push_back?使用帶右值引用的push_back?

我有以下代碼:

csvData.push_back(CsvDataSet(csvBlock)); 

我應該不是這樣做:

csvData.push_back(std::move(CsvDataSet(csvBlock))); 

這樣,我救一個複製操作。

+0

你應該明確指出'CsvDataSet'是一個返回某個值的類或函數。 – Snps

回答

5

假設CsvDataSet是一個類:不,你不應該。 CsvDataSet(csvBlock)已經是右值。更準確地說,它是一個預值

因此在這兩種情況下,void std::vector::push_back(T&& value);都會被調用。

+0

好的,我應該從我的代碼中刪除模板。這是一個關於普通類而不是模板的問題。 – user3111311

+0

啊哈我知道了,所以這已經是一個臨時值,這是一個右值。太好了! – user3111311

+0

調用*轉換構造函數*的結果是一個** prvalue **。 – MWid

2

我認爲你的情況你應該使用emplace_back()。 「

」在容器的末尾添加一個新元素,該元素是就地構造的,即不執行任何複製或移動操作,該元素的構造函數被調用,提供的參數完全相同功能。」

不確定,但我認爲這相當於使用push_back(std::move(T())),但也許downvoter糾正我,請。 澄清結果應該是相同的,但emplace將構造函數的參數轉發並構造元素,而push_back調用move構造函數或普通構造函數,然後移動對象。

編輯:如果downvoter同意@ user3111311提供的推理,我會敦促您閱讀示例 section in emplace_back()

+1

emplace_back在C++ 11中是多餘的,應該用push_back代替 – user3111311

+0

@ user3111311什麼?!你能支持它嗎?它是在C++ 11中引入的。爲什麼標準委員會將冗餘包括在內?這是一種美學觀點嗎? – luk32

+1

emplace_back旨在成爲push_back的「高效」版本。既然我們有右值引用的push_back,那就不需要了。爲了向後兼容,它保存在C++ 11中。 – user3111311