我知道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