C++11 C+;中使用移动语义的最常见位置是什么+;11 STL?

C++11 C+;中使用移动语义的最常见位置是什么+;11 STL?,c++11,stl,move-semantics,C++11,Stl,Move Semantics,我知道std::vector::push_back()支持移动语义。因此,当我向向量添加一个命名的临时实例时,我可以使用std::move() 在STL中,我应该养成添加std::move() 我知道std::vector::push_back()支持移动语义 push_-back的支持只是一个额外的重载,它接受一个右值引用,因此可以通过调用T(T&&)而不是T(const T&)来构造向量中的新值T。优点是前者可以更有效地实现,因为它假定传递的右值引用以后永远不会被使用 大多数标准库容器都向其

我知道
std::vector::push_back()
支持移动语义。因此,当我向向量添加一个命名的临时实例时,我可以使用
std::move()

在STL中,我应该养成添加
std::move()

我知道
std::vector::push_back()
支持移动语义

push_-back
的支持只是一个额外的重载,它接受一个右值引用,因此可以通过调用
T(T&&)
而不是
T(const T&)
来构造向量中的新值
T
。优点是前者可以更有效地实现,因为它假定传递的右值引用以后永远不会被使用

大多数标准库容器都向其push/enqueue/insert成员函数添加了类似的重载。此外,还添加了安放的概念(例如,
std::vector::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\u cast


STL中还有哪些常见的地方我应该养成添加
std::move
的习惯

这是一个非常广泛的问题-您应该在任何有意义的地方添加
std::move
,而不仅仅是在标准库的上下文中。如果您知道在特定代码路径中不再使用左值,并且希望将其传递/存储到某个位置,则
std::move

我知道
std::vector::push_back()
支持移动语义

push_-back
的支持只是一个额外的重载,它接受一个右值引用,因此可以通过调用
T(T&&)
而不是
T(const T&)
来构造向量中的新值
T
。优点是前者可以更有效地实现,因为它假定传递的右值引用以后永远不会被使用

大多数标准库容器都向其push/enqueue/insert成员函数添加了类似的重载。此外,还添加了安放的概念(例如,
std::vector::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\u cast


STL中还有哪些常见的地方我应该养成添加
std::move
的习惯

这是一个非常广泛的问题-您应该在任何有意义的地方添加
std::move
,而不仅仅是在标准库的上下文中。如果您知道在特定代码路径中不再使用左值,并且希望将其传递/存储到某个位置,则
std::move

“临时命名”<代码>放置回(某些类型{..})将做正确的事情(优化后)。“命名临时”<代码>放置回(某些类型{..})将做正确的事情(优化后)。