返回成员变量时如何利用移动语义?

ano*_*orm 9 c++ move-semantics c++11

我正在实现一个构建uint8_t向量的工厂类.我希望能够在返回结果向量时使用移动语义.这似乎有效,但我不相信这是完成我想要的正确方法.

我已经看到了很多关于如何将返回的自动变量视为rvalue并使用调用代码的move构造函数的示例,但在我的示例中,返回的对象是成员.我知道如果调用者将返回值放入移动构造函数中,该成员将丢失其内容 - 这正是我想要的.

我写的是这样的:

#include <cstdint>
#include <iostream>
#include <vector>

class Factory
{
public:
    std::vector<uint8_t> _data;

    Factory(std::size_t size) :
        _data(size, 0)
    {
    }

    void buildContent(int param)
    {
        // perform operations on the contents of _data
    }

    std::vector<uint8_t> && data()
    {
        return std::move(_data);
    }
};

int main()
{
    Factory factory(42);
    factory.buildContent(1);
    std::vector<uint8_t> temp(factory.data());
    std::cout << "temp has " << temp.size() << " elements" << std::endl;
    std::cout << "factory._data has " << factory._data.size() << " elements" << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

哦,示例代码输出以下内容:

temp has 42 elements
factory._data has 0 elements
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 6

首先,你必须决定你想要什么.你真的想从你的实例中吸取数据吗?如果是这样,你所取得的成就就是那么好.另一方面,它看起来很不安全.你可以做的是使用引用限定符来强制你只在实例本身是一个右值引用时返回一个右值引用:

std::vector<uint8_t> && data() && // called on rvalue
{
    return std::move(_data);
}

// return lvalue ref or value
std::vector<uint8_t>& data() & // called on lvalue
{
    return _data;
}
Run Code Online (Sandbox Code Playgroud)

最后,这一切都取决于您试图解决的问题,这在您的问题中并不明显.