2017-02-17 28 views
0

我知道std::vector<T>::push_back()有移動語義支持。所以,當我向矢量添加一個命名的臨時實例時,我可以使用std::move()在C++ 11 STL中,最常見的移動語義的地方是什麼?

什麼是我應該成長STL其他常見的地方的習慣來添加std::move()

+0

「命名臨時」? 'emplace_back(some_type {..})'只會做正確的事情(優化後)。 – knivil

回答

2

我知道std::vector<T>::push_back()具有移動語義支持。

push_back具有支撐僅僅是一個附加的過載,其採用右值參考,使得矢量內的新值T可以通過調用T(T&&)代替T(const T&)構成。優點是前者可以更高效地實現,因爲它假定傳遞的右值引用之後永遠不會被使用。

最標準的庫容器增加了類似的重載他們推/排隊/插入成員函數。此外,炮位的概念已被添加(例如std::vector<T>::emplace_back,其中值被構造在所述容器內部的地方,以避免不必要的臨時。安置應該比插入/推送更受歡迎。


所以,當我添加一個名爲臨時實例爲載體,我可以使用std::move()

「命名的臨時」並沒有真正太大的意義。這個想法是,你有一個左值你不關心了,而且要通過使用std::move把它變成一個臨時的。例如:

Foo foo; 
some_vector.emplace_back(std::move(foo)); 
// I'm sure `foo` won't be used from now on 

只要記住,std::move不是特殊:它的字面意思是static_cast<T&&>


什麼是我應該成長的習慣來添加std::move STL的其他常見的地方?

這是一個非常廣泛的問題 - 您應該在任何地方添加std::move它有意義,而不僅僅是在標準庫的上下文中。如果你有一個左值你知道你不會在特定的代碼路徑再使用,並且希望通過它/它存儲在某處,然後std::move它。

相關問題