C++ 返回带有std::move和chain函数的对象

C++ 返回带有std::move和chain函数的对象,c++,chaining,stdmove,C++,Chaining,Stdmove,我创建了一个以这种方式返回对象的方法: MyObject && MyController::getMyObject (const otherObject & options) const { MyObject tmp; tmp.doSometing(options); return std::move(tmp); } 在稍后的代码中,我希望将该方法用于链式调用,如下所示: controller.getMyObject(options).do

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

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

    tmp.doSometing(options);

    return std::move(tmp);
}
在稍后的代码中,我希望将该方法用于链式调用,如下所示:

controller.getMyObject(options).doAnotherThing();
它不起作用,对“doNotherthing”的调用依赖于一个空对象。我知道如何解决这个问题:

auto tmp = controller.getMyObject(options);

tmp.doAnOtherThing();
我的问题是: 首先,这个方法写得正确吗? 我怎样才能避免使用第二种方法呢?这真的很难理解

注:“MyObject”是可移动的

首先,这个方法写得正确吗

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

我怎样才能避免使用第二种方法呢

按值返回

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

    tmp.doSometing(options);

    return tmp;
}
<>上述将以两种方式之一,因为在C++中如何设置N/RVO。
tmp
将被省略,并且
getMyObject
直接对结果对象进行操作。或者通过移动
tmp
来构造结果对象。无论哪种方式,都可以获得用于方法链接的有效对象

首先,这个方法写得正确吗

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

我怎样才能避免使用第二种方法呢

按值返回

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

    tmp.doSometing(options);

    return tmp;
}
<>上述将以两种方式之一,因为在C++中如何设置N/RVO。
tmp
将被省略,并且
getMyObject
直接对结果对象进行操作。或者通过移动
tmp
来构造结果对象。无论哪种方式,都可以获得用于方法链接的有效对象

首先,这个方法写得正确吗

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

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

一种正确的方法,也可能是您插入的是返回一个对象,而不是一个引用:

MyObject
MyController::getMyObject (const otherObject & options) const
{
    MyObject tmp;
    tmp.doSometing(options);
    return tmp;
}
首先,这个方法写得正确吗

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

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

一种正确的方法,也可能是您插入的是返回一个对象,而不是一个引用:

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

基本上是一个骗局。TL;DR:永远不要返回指向非静态函数局部变量的指针或引用。看看这个基本上是重复的。TL;DR:永远不要返回指向非静态函数局部变量的指针或引用。看看这个是的,就是这个想法。我会用你的解决方案。是的,就是这个想法。我将使用你的解决方案。