返回带有std :: move的对象,并将其链接到函数

时间:2018-10-23 13:12:52

标签: c++ chaining stdmove

我制作了一种以这种方式返回对象的方法:

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”是可移动的。

2 个答案:

答案 0 :(得分:2)

  

首先,方法是否正确编写?

不。您返回对超出范围的对象的引用。

  

如何避免编写第二种用法?

按值返回。

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

    tmp.doSometing(options);

    return tmp;
}

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

答案 1 :(得分:2)

  

首先,方法是否正确编写?

不。该函数返回一个悬空的引用。

第一次和第二次使用都具有未定义的行为。

一种正确的方法,并且可能是您想要的,是返回一个对象而不是引用:

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