我知道std::vector<T>::push_back()
有移動語義支持。所以,當我向矢量添加一個命名的臨時實例時,我可以使用std::move()
。在C++ 11 STL中,最常見的移動語義的地方是什麼?
什麼是我應該成長STL其他常見的地方的習慣來添加std::move()
我知道std::vector<T>::push_back()
有移動語義支持。所以,當我向矢量添加一個命名的臨時實例時,我可以使用std::move()
。在C++ 11 STL中,最常見的移動語義的地方是什麼?
什麼是我應該成長STL其他常見的地方的習慣來添加std::move()
我知道
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
它。
「命名臨時」? 'emplace_back(some_type {..})'只會做正確的事情(優化後)。 – knivil