你可以重用一个移动的std :: string吗?

时间:2014-12-09 10:25:59

标签: c++ c++11 move-semantics

给出这个例子:

 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向量,它变为空。我想确保这不是标准中未定义的行为,并且仅仅因为运气不起作用。

3 个答案:

答案 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参数保留为有效但未指定的状态。