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() 导致复制而不是移动的原因。
我正在尝试了解移动语义是如何工作的,尤其是在标准字符串中。我主要关心的是如何通过方法公开 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() 导致复制而不是移动的原因。