return 临时值的右值

return rvalue of temporary as value

所以,我有以下 class:

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

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

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

现在,我想知道的情况是:如果我直接 return 禁止方法而不事先存储会发生什么:

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

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

我认为这在理论上应该没问题,因为 testFunc return 是在 foo 被销毁之前从右值构造的值 - 但如果编译器应用 return-value-optimization?

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

is test now valid?

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

but is this still the case if the compiler applies return-value-optimization?

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。