[英]std::vector<T>::emplace_back on an rvalue reference
我在 class 中有以下 function
void add_state(std::string &&st) {
state.emplace_back(st); // state is a vector
}
根据我的理解, st
是一个左值(在这种情况下是对字符串的右值引用)。 如果我想将st
移动到state
的最后一个元素中,我应该使用state.emplace_back(std::move(st))
吗? 如果我按照上面写的方式保留它会发生什么?
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)
调用它?
[...] 我应该使用
state.emplace_back(std::move(st))
吗?
是的。
如果我按照上面写的方式保留它会发生什么?
您已正确确定st
是一个左值,因此它被复制了。
如果我
add_state(std::string &st)
会更好吗? 在这种情况下,我想我可以简单地用add_state(str)
调用它?
你可以,但你不应该。 std::move
只是类型杂耍,它本身不会做任何事情(特别是,它不会移动任何东西)。 实际操作发生在std::string::basic_string(std::string &&)
内部, emplace_back
在收到std::string &&
后调用它。 使您自己的参数成为左值引用除了让调用者感到惊讶之外没有任何效果,调用者会在没有std::move
的情况下吃掉他们的std::string
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.