首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象返回右值引用。

对象返回右值引用。
EN

Stack Overflow用户
提问于 2013-01-31 06:17:11
回答 3查看 201关注 0票数 2

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

代码语言:javascript
复制
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的恰当使用吗?我可以保证每次对process的调用只会调用一次getState,但是由于这个特定系统的设计,我不能仅仅从process返回newState。关于Stack Overflow和其他地方的许多其他答案都说,只返回对象更好,因为编译器会移动它或RVO它,但这些都是在返回的对象是函数的本地对象的情况下。

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

EN

回答 3

Stack Overflow用户

发布于 2013-01-31 06:36:58

原来的演示代码有错误-- unique_ptr永远不会释放指针。答案涉及到移动到局部函数空间,然后正常返回。

代码语言:javascript
复制
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;
    }
};
票数 1
EN

Stack Overflow用户

发布于 2013-01-31 06:30:04

只返回状态有什么问题

代码语言:javascript
复制
struct state {};
class processor {
public:
  void process() {
    state_ = State();
  }

  state get_state() {
    return std::move(state_);
  }

private:
  state state_;
};

这将在构造处理器时默认构造state_,但您可以使用optional包装器防止这种情况发生。您仍然必须保证只在process之后调用get_state,这是非常糟糕的。

票数 0
EN

Stack Overflow用户

发布于 2013-01-31 07:15:11

您可以只返回类型为std::unique_ptr<State>state,它将与std::move(state)一起完美地移动。在这种情况下,当通过值返回时,您无需复制整个state对象。如果调用者没有捕获state对象,它将被自动销毁。对于复杂的堆分配对象来说,这是一种非常有效的方法。但是要小心,通过移动state可以清除Processor对象的状态。因此,在这种情况下,getState不是最好的名称,它应该像fetchStatepopState一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14614903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档