Return 具有 std::move 的对象并链接函数
Return an object with std::move and chain the function
我创建了一个 returns 对象的方法:
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"可移动
In the first place, is the method written correctly ?
没有。您 return 对超出范围的对象的引用。
How can I avoid to write the second way for the usage ?
Return 按值。
MyObject
MyController::getMyObject (const otherObject & options) const
{
MyObject tmp;
tmp.doSometing(options);
return tmp;
}
由于 N/RVO 在 C++ 中的设置方式,以上将以两种方式之一运行。 tmp
将被省略,而 getMyObject
直接对结果对象进行操作。或者通过移动tmp
构造结果对象。无论哪种方式,您都会得到一个有效的对象用于方法链接。
In the first place, is the method written correctly ?
没有。函数 return 是一个悬空引用。
第一种和第二种用法都有未定义的行为。
一个正确的方法,可能你想要的是return一个对象,而不是一个引用:
MyObject
MyController::getMyObject (const otherObject & options) const
{
MyObject tmp;
tmp.doSometing(options);
return tmp;
}
我创建了一个 returns 对象的方法:
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"可移动
In the first place, is the method written correctly ?
没有。您 return 对超出范围的对象的引用。
How can I avoid to write the second way for the usage ?
Return 按值。
MyObject
MyController::getMyObject (const otherObject & options) const
{
MyObject tmp;
tmp.doSometing(options);
return tmp;
}
由于 N/RVO 在 C++ 中的设置方式,以上将以两种方式之一运行。 tmp
将被省略,而 getMyObject
直接对结果对象进行操作。或者通过移动tmp
构造结果对象。无论哪种方式,您都会得到一个有效的对象用于方法链接。
In the first place, is the method written correctly ?
没有。函数 return 是一个悬空引用。
第一种和第二种用法都有未定义的行为。
一个正确的方法,可能你想要的是return一个对象,而不是一个引用:
MyObject
MyController::getMyObject (const otherObject & options) const
{
MyObject tmp;
tmp.doSometing(options);
return tmp;
}