2017-02-17 73 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它。

相关问题