std::vector<T>::emplace_back 在右值引用上
std::vector<T>::emplace_back on an rvalue reference
我在 class
中有以下函数
void add_state(std::string &&st) {
state.emplace_back(st); // state is a vector
}
根据我的理解,st
是一个左值(在本例中是对字符串的右值引用)。如果我想将 st
移动到 state
的最后一个元素中,我应该使用 state.emplace_back(std::move(st))
吗?如果我按照上面写的方式保留它会怎样?
编辑 1(如何调用 add_state
的示例):
// do a series of operations to acquire std::string str
add_state(std::move(str));
// also note that str will never be used again after passing it into add_state
如果我改为 add_state(std::string &st)
会不会更好?在这种情况下,我想我可以简单地用 add_state(str)
?
来调用它
[...] should I be using state.emplace_back(std::move(st))
?
是的。
What happens if I leave it the way it's written above?
您已正确识别 st
是一个左值,因此它被复制了。
Would it be better if I made add_state(std::string &st)
instead? In this case, I think I can just simply call it with add_state(str)
?
你可以,但你不应该。 std::move
只是类型杂耍,它本身不会做任何事情(特别是,它不会移动任何东西)。实际操作发生在 std::string::basic_string(std::string &&)
内部,emplace_back
在收到 std::string &&
后调用它。使您自己的参数成为左值引用除了让调用者感到惊讶之外没有任何效果,调用者在没有 std::move
的情况下吃掉了 std::string
。
我在 class
中有以下函数 void add_state(std::string &&st) {
state.emplace_back(st); // state is a vector
}
根据我的理解,st
是一个左值(在本例中是对字符串的右值引用)。如果我想将 st
移动到 state
的最后一个元素中,我应该使用 state.emplace_back(std::move(st))
吗?如果我按照上面写的方式保留它会怎样?
编辑 1(如何调用 add_state
的示例):
// do a series of operations to acquire std::string str
add_state(std::move(str));
// also note that str will never be used again after passing it into add_state
如果我改为 add_state(std::string &st)
会不会更好?在这种情况下,我想我可以简单地用 add_state(str)
?
[...] should I be using
state.emplace_back(std::move(st))
?
是的。
What happens if I leave it the way it's written above?
您已正确识别 st
是一个左值,因此它被复制了。
Would it be better if I made
add_state(std::string &st)
instead? In this case, I think I can just simply call it withadd_state(str)
?
你可以,但你不应该。 std::move
只是类型杂耍,它本身不会做任何事情(特别是,它不会移动任何东西)。实际操作发生在 std::string::basic_string(std::string &&)
内部,emplace_back
在收到 std::string &&
后调用它。使您自己的参数成为左值引用除了让调用者感到惊讶之外没有任何效果,调用者在没有 std::move
的情况下吃掉了 std::string
。