【问题标题】:C++ return string by value with move semanticsC++ 使用移动语义按值返回字符串
【发布时间】:2021-01-20 04:11:10
【问题描述】:

我试图了解移动语义如何特别适用于标准字符串。我主要关心的是如何通过方法(例如 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() 方法都按值返回。

我预计 get1() 会自动移动内部 _s,但正如您所见,情况并非如此。另一方面,get2() 采取了行动,尽管这是我明确要求的。

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

【问题讨论】:

  • 这能回答你的问题吗? What is move semantics?
  • 等等,你到底想要什么?我不希望get1 移动_s
  • @user202729 为什么不呢? get1() 的签名按值返回,字符串类有一个移动构造函数。
  • 显然,人们不会期望在 get1() 中返回一个字符串会清除源字符串。 只有在返回本地对象时才会发生自动移动 (这将否则会被销毁)。据我所知,由于小字符串优化,get2() 的结果不能保证是您观察到的结果。
  • 很好,很好。让我检查一下。

标签: c++ move


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多