C++ return 带移动语义的按值字符串

C++ return string by value with move semantics

我正在尝试了解移动语义是如何工作的,尤其是在标准字符串中。我主要关心的是如何通过方法公开 class 的字符串成员变量,例如 getter.

所以我做了这个示例程序。

#include <iostream>
#include <string>

using namespace std;

class Object {

    string _s;

public:

    Object(string s) : _s(s) {}

    string get1() { return _s; }

    string get2() { return move(_s); }

    void print() { cout << "'" << _s << "'" << endl; }
};

int main() {
    Object obj("0123456789ABCDEF_");

    string s1 = obj.get1();
    obj.print(); // prints '0123456789ABCDEF_'

    string s2 = obj.get2();
    obj.print(); // prints ''
}

两种方法 get1() 和 get2() return 按值。

我原以为 get1() 会自动移动内部 _s,但正如您所见,事实并非如此。另一方面,get2() 进行了移动,尽管这是我明确要求的预期结果。

所以问题是为什么get1()不移动_s。

Phil1970 在上面的评论中回答了这个问题。

移动语义适用于右值。 _s 成员变量显然是一个左值,这就是为什么 get1() 导致复制而不是移动的原因。