使用帶右值引用的push_back?使用帶右值引用的push_back?
我有以下代碼:
csvData.push_back(CsvDataSet(csvBlock));
我應該不是這樣做:
csvData.push_back(std::move(CsvDataSet(csvBlock)));
這樣,我救一個複製操作。
使用帶右值引用的push_back?使用帶右值引用的push_back?
我有以下代碼:
csvData.push_back(CsvDataSet(csvBlock));
我應該不是這樣做:
csvData.push_back(std::move(CsvDataSet(csvBlock)));
這樣,我救一個複製操作。
假設CsvDataSet
是一個類:不,你不應該。 CsvDataSet(csvBlock)
已經是右值。更準確地說,它是一個預值。
因此在這兩種情況下,void std::vector::push_back(T&& value);
都會被調用。
好的,我應該從我的代碼中刪除模板。這是一個關於普通類而不是模板的問題。 – user3111311
啊哈我知道了,所以這已經是一個臨時值,這是一個右值。太好了! – user3111311
調用*轉換構造函數*的結果是一個** prvalue **。 – MWid
我認爲你的情況你應該使用emplace_back()
。 「
」在容器的末尾添加一個新元素,該元素是就地構造的,即不執行任何複製或移動操作,該元素的構造函數被調用,提供的參數完全相同功能。」
不確定,但我認爲這相當於使用push_back(std::move(T()))
,但也許downvoter糾正我,請。 澄清結果應該是相同的,但emplace
將構造函數的參數轉發並構造元素,而push_back
調用move
構造函數或普通構造函數,然後移動對象。
編輯:如果downvoter同意@ user3111311提供的推理,我會敦促您閱讀示例 section in emplace_back()
。
emplace_back在C++ 11中是多餘的,應該用push_back代替 – user3111311
@ user3111311什麼?!你能支持它嗎?它是在C++ 11中引入的。爲什麼標準委員會將冗餘包括在內?這是一種美學觀點嗎? – luk32
emplace_back旨在成爲push_back的「高效」版本。既然我們有右值引用的push_back,那就不需要了。爲了向後兼容,它保存在C++ 11中。 – user3111311
你應該明確指出'CsvDataSet'是一個返回某個值的類或函數。 – Snps