c++ - 从非本地返回一个右值引用

标签 c++ c++11 move-semantics unique-ptr rvalue-reference

我有一个查询内部状态对象的类:

class State {...}; //Has a copy and move constructor
class Processor
{
private:
    std::unique_ptr<State> state;

public:
    void process(...)
    {
        State newState;
        ... //create this new state
        state.reset(new State(newState));
    }

    State getState()
    {
        return std::move(*state.release());
    }
};

这是对 std::move 的恰当使用吗? ?我可以保证 getState每次调用 process 只会被调用一次, 但由于这个特定系统的设计,我不能只返回 newState来自 process . Stack Overflow 和其他地方的许多其他答案都说最好只返回对象,因为编译器会 move 它或 RVO 它,如果可以的话,但这些都是在返回的对象是函数本地的情况下.

我不一定需要将状态对象置于 unique_ptr 之后,但这似乎是管理新状态对象的最简单方法。我的实际实现有一个指针在最后直接传输到 unique_ptr。

最佳答案

事实证明,原始演示代码存在错误——unique_ptr 永远不会释放指针。答案涉及 move 局部函数空间,然后正常返回。

class State {...}; //Has a copy and move constructor
class Processor
{
private:
    std::unique_ptr<State> state;

public:
    void process(...)
    {
        State* newState;
        ... //newState is allocated on the heap somehow
        state.reset(newState);
    }

    State getState()
    {
        State _state(std::move(*state));
        //Optionally: state.reset();
        return _state;
    }
};

关于c++ - 从非本地返回一个右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14614903/

相关文章:

c++ - POD 结构体的值初始化是 constexpr?

c++ - 为什么std::move复制右值或const左值函数参数的内容?

c++ - 返回函数参数,可能,糟糕的风格?

c++ - 将变量分配给数组的函数

c++ - 解析来自串口的完整消息

c++ - 使用 std::vector 成员的 std::vector 为类实现 move 语义的正确方法

c++11 - 取消引用新对象时 move 语义和构造函数

c++ - 在 MPI_Send/MPI_Recv 对中,如果没有正确同步,数据会丢失吗?

c++ - Clang 和 GCC 在使用大括号表示法和 initializer_list 时不同意构造函数的选择

c++ - 为什么对对象生成器调用的右值引用需要复制构造函数?