Я сделал метод, который возвращает объект таким образом:
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» является подвижным.
Во-первых, правильно ли написан метод?
Нет. Функция возвращает висячую ссылку.
Как первое, так и второе использование имеют неопределенное поведение.
Правильный способ, и, вероятно, вы намеревались вернуть объект, а не ссылку:
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;
}
Вышеуказанное будет вести себя одним из двух способов из-за того, как N / RVO настроен в C ++. Или tmp
будут опущены и getMyObject
действует непосредственно на объект результата. Или результат объекта создается путем перемещения tmp
, В любом случае, вы получаете действительный объект для использования в цепочке методов.