Return 具有 std::move 的对象并链接函数

Return an object with std::move and chain the function

我创建了一个 returns 对象的方法:

MyObject && 
MyController::getMyObject (const otherObject & options) const
{
    MyObject tmp;

    tmp.doSometing(options);

    return std::move(tmp);
}

稍后在我的代码中,我想将该方法用于链式调用,如下所示:

controller.getMyObject(options).doAnotherThing();

而且它不起作用,对 "doAnotherThing" 的调用依赖于一个空对象。我知道如何解决这个问题:

auto tmp = controller.getMyObject(options);

tmp.doAnOtherThing();

我的问题是: 首先,方法写对了吗? 我怎样才能避免写第二种用法?真的很丑...

注:"MyObject"可移动

In the first place, is the method written correctly ?

没有。您 return 对超出范围的对象的引用。

How can I avoid to write the second way for the usage ?

Return 按值。

MyObject 
MyController::getMyObject (const otherObject & options) const
{
    MyObject tmp;

    tmp.doSometing(options);

    return tmp;
}

由于 N/RVO 在 C++ 中的设置方式,以上将以两种方式之一运行。 tmp 将被省略,而 getMyObject 直接对结果对象进行操作。或者通过移动tmp构造结果对象。无论哪种方式,您都会得到一个有效的对象用于方法链接。

In the first place, is the method written correctly ?

没有。函数 return 是一个悬空引用。

第一种和第二种用法都有未定义的行为。

一个正确的方法,可能你想要的是return一个对象,而不是一个引用:

MyObject
MyController::getMyObject (const otherObject & options) const
{
    MyObject tmp;
    tmp.doSometing(options);
    return tmp;
}