将std ::字符串移至功能参数

Move a std::string to function param

本文关键字:功能 参数 字符串 std      更新时间:2023-10-16

我想将一个大的std ::字符串移至班级成员。

这是我的代码:

#include <cassert>
#include <string>
#include <iostream>
using namespace std;
class SomeClass {
public:
    void some_method(std::string&& str) {
        my_str = str;
    }
    std::string my_str;
};
int main() {
    SomeClass some_class;
    std::string large_str(100000, 'a');
    some_class.some_method(std::move(large_str));
    assert(large_str.empty());
    assert(!some_class.my_str.empty());
    return 0;
}

移动后,我预计large_str是空的,但是此代码在assert(large_str.empty())行中失败。

我是否误解了std::move的语义?

我是否误解了std::move的语义?

部分,是的。您忘了将功能参数str施加到rvalue。在some_method中,它再次成为LVALUE。要解决这个问题:

void some_method(std::string&& str) {
    my_str = std::move(str);
    //       ^^^^^^^^^ Necessary: invoke std::move a 2nd time
}

,但请注意以下内容。您应该使用assert的"移动" std::string对象。从这里,Overload#8(重点是我的):

移动构造函数。使用移动语义构建字符串的内容。另一个留在有效中,但未指定的状态

您不希望您的程序取决于未指定的状态(即使碰巧特定的实现使std::string::size返回0之后,其资源消费后也会返回0)。