返回临时的rvalue作为值

时间:2018-06-05 09:41:55

标签: c++ rvalue rvo

所以,我有以下课程:

class Foo {
public:
    Bar &&bar() {
        return std::move(_bar);
    }
private:
    Bar _bar;
}

我知道在以下上下文中使用此类是有效的:

Bar bar;
{
    Foo foo;
    bar = foo.bar(); // bar is move-assigned, as foo is still in scope
}

现在,我想知道的情况是:如果我直接从方法返回bar而不事先存储它会发生什么:

Bar testFunc() {
    Foo foo;
    return foo.bar();
}

Bar test = testFunc();
// is test now valid?

我认为这在理论上应该没问题,因为testFunc返回一个在foo被销毁之前从rvalue构造的值 - 但如果编译器应用返回值仍然是这种情况 - 优化

我想我有点困惑这究竟是如何运作的......

1 个答案:

答案 0 :(得分:1)

  

现在测试有效吗?

只要未访问移动的对象,代码就应该有效。

  

但如果编译器适用,情况仍然如此   返回值优化?

Bar testFunc() {
    Foo foo;          // Bar is constructed here
    return foo.bar(); // prvalue is move-constructed and copy elided
}
Bar test = testFunc(); // default ctor + move ctor (one copy elision)

总共执行一次复制。

搬出一名成员似乎是一种代码味道。在不知道具体用法的情况下很难判断,但也许:

Bar make_bar(const Foo& foo) {
    Bar bar;
    // init bar as needed
    return bar;
}

这样两次调用都会导致RVO。