成员函数返回成员变量的RVALUE参考

Member function return rvalue reference of member variable

本文关键字:成员 RVALUE 参考 变量 函数 返回      更新时间:2023-10-16
#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,然后将TEMP vector分配给v

无需添加...

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

但在一般情况下:

版本1 Will 肯定将成员data留在一些未指定的"空"状态中。即使丢弃函数返回值。

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