【问题标题】:Can you reuse a moved std::string? [duplicate]你可以重复使用移动的 std::string 吗? [复制]
【发布时间】:2015-02-07 04:59:45
【问题描述】:

举个例子:

 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 吗?这个 sn-p 似乎工作:在curr 被移到里面之后 result 向量,它变为空。我想确定这不是标准中未定义的行为,并且它不能仅仅因为运气而起作用。

【问题讨论】:

  • 它处于有效但未指定的状态。不保证为空。
  • 我认为这里的区别是微妙的,例如:小字符串优化

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


【解决方案1】:

除了少数例外情况(例如智能指针),移出对象会处于有效但未指定的状态。

在使用小字符串优化的std::string中,例如,如果字符串很小,则没有动态分配,并且移动是复制。在这种情况下,实现保持源字符串不变是完全有效的,并且不会产生清空字符串的额外成本。

【讨论】:

    【解决方案2】:

    可能,这个link会很有用

    简而言之,为了重用你需要调用.clear方法

    【讨论】:

    • 您不需要致电clear()。您可以只分配给它,或调整它的大小,或任何其他没有前提条件的操作。
    【解决方案3】:

    来自http://en.cppreference.com/w/cpp/utility/move

    ...所有接受右值引用参数(例如 std::vector::push_back)的标准库函数都保证将移出的参数保持在有效但未指定的状态。

    【讨论】:

    • 没有回答op关于是否可以重复使用的问题。
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2021-08-23
    • 2012-07-01
    • 2011-09-24
    相关资源
    最近更新 更多