c++ - 成员函数返回成员变量的右值引用

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

#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();
    }
}

函数 1函数 2 有什么区别?

function 1move(data) 构造一个临时 vector 然后将临时 vector 赋值给v?

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

最佳答案

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

但在一般情况下:

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

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

关于c++ - 成员函数返回成员变量的右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47757515/

相关文章:

c++ - 结构类型为 NTTP : why must all members be public?

c++ - 为什么 vector 的 move ctor 不推导出 noexcept()?

c++ - “bzero”未在此范围内声明

c++ - 在 cuda 线程之间共享大量常量数据

c# - 如何检查桌面 GUI 应用程序中是否存在密码字段?

C++ move 语义 : why copy assignment operator=(&) is called instead of move assignment operator=(&&)?

linux - MV : cannot overwrite directory with non-directory

java - 如何使用 OpenJPA 将对象从一个表 "move"转移到另一个表?

c++ - 按值传递临时值时如何避免 move 省略?

c++ - 转换为 `const Y` 不适用于 clang 上的 `R&&`