【问题标题】:Member function return rvalue reference of member variable成员函数返回成员变量的右值引用
【发布时间】:2018-05-25 05:55:34
【问题描述】:
#include <vector>
using namespace std;

struct TempData {
    vector<int> data;
    TempData() {
        for(int i = 0; i < 100; i++) data.push_back(i);
    }
    // vector<int> GetData() { // function 1
    //  return move(data);
    // }
    vector<int>&& GetData() { // function 2
        return move(data);
    }
};

int main() {
    vector<int> v;
    {
        TempData td;
        v = td.GetData();
    }
}

function 1function 2 有什么区别?

function 1 会用move(data) 构造一个临时vector,然后将临时vector 分配给v

没有更多细节要添加...

【问题讨论】:

  • 一个函数返回一个新向量,另一个不返回。
  • 您应该考虑对引用限定符进行重载。见stackoverflow.com/questions/21052377/…
  • 如果你需要这样做,你应该考虑将对象传入,然后你就不需要它了。

标签: c++ move move-semantics rvalue-reference xvalue


【解决方案1】:

在您的小测试用例中,可能没有区别。额外的临时对象几乎肯定会被忽略。而 main 中的 v 将保存成员变量的内容。

但在一般情况下:

版本 1肯定让成员 data 处于某种未指定的“空”状态。即使函数返回值被丢弃。

第 2 版可能使成员处于某种未指定的空状态,也可能不会。例如,如果调用该函数并丢弃其返回值,则该成员将保持不变。这就是为什么可以说std::move 本身不会移动任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2020-08-09
    • 2023-03-03
    • 2019-09-03
    相关资源
    最近更新 更多