c++ - 你能重用 move 的 std::string 吗?

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

最佳答案

除了少数异常(exception)(例如智能指针),移出的对象将保留在有效但未指定的状态。

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

关于c++ - 你能重用 move 的 std::string 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27376623/

相关文章:

c++ - 同一台机器上的多个fastcgi程序

c++ - 填充与矩形相交的蒙版轮廓

c++ - 使用模板变量类型执行上下文特定操作

c++ - 为具有 std::thread 成员的类 move 构造函数

c++ - move 语义如何在 vector 重定位中起作用?

c++ - 如何在 std::deque 中避免 `deque iterator not dereferencable`?锁?

c++ - 支持单个位偏移的类似“memcpy”的函数?

c++ - 为什么 c++11 sleep_for microseconds 实际上休眠了毫秒?

c++ - 列表分配错误 <shared_ptr>

c++ - "move semantics"和 "rvalue reference"的 Visual Studio 实现