给出这个例子:
std::vector<std::string> split(const std::string& str) {
std::vector<std::string> result;
std::string curr;
for (auto c : str) {
if (c == DELIMITER) {
result.push_back(std::move(curr)); // ATTENTION HERE!
} else {
curr.push_back(c);
}
}
result.push_back(std::move(curr));
return result;
}
我可以重用curr
std:string吗?此片段似乎有效:将curr
移入内部后
result
向量,它变为空。我想确保这不是标准中未定义的行为,并且仅仅因为运气不起作用。
答案 0 :(得分:12)
除了少数例外(例如智能指针),移动的对象将保持有效但未指定的状态。
在使用小字符串优化的std::string
中,例如,如果字符串很小,则没有动态分配,移动是副本。在这种情况下,实现保持源字符串不受影响是完全有效的,并且不会产生清空字符串的额外成本。
答案 1 :(得分:3)
可能是,这个link会很有用
简而言之,要重复使用,您需要调用.clear
方法
答案 2 :(得分:2)
来自http://en.cppreference.com/w/cpp/utility/move
...所有接受rvalue引用参数的标准库函数(例如std :: vector :: push_back)都保证将move-from参数保留为有效但未指定的状态。