0

我创建了一个以这种方式返回对象的方法:

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

4

2 回答 2

2

首先,方法写对了吗?

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

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

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

MyObject
MyController::getMyObject (const otherObject & options) const
{
    MyObject tmp;
    tmp.doSometing(options);
    return tmp;
}
于 2018-10-23T13:19:41.727 回答
2

首先,方法写对了吗?

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

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

按值返回。

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

    tmp.doSometing(options);

    return tmp;
}

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

于 2018-10-23T13:19:26.987 回答