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:永远不要返回指向非静态函数局部变量的指针或引用。看看这个是的,就是这个想法。我会用你的解决方案。是的,就是这个想法。我将使用你的解决方案。