我制作了一种以这种方式返回对象的方法:
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”是可移动的。
答案 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;
}