Вернуть объект с помощью std :: move и связать функцию

Я сделал метод, который возвращает объект таким образом:

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

Решение

Во-первых, правильно ли написан метод?

Нет. Функция возвращает висячую ссылку.

Как первое, так и второе использование имеют неопределенное поведение.

Правильный способ, и, вероятно, вы намеревались вернуть объект, а не ссылку:

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

Другие решения

Во-первых, правильно ли написан метод?

Нету. Вы возвращаете ссылку на объект, который вышел из области видимости.

Как я могу избежать писать второй способ использования?

Возврат по значению.

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

tmp.doSometing(options);

return tmp;
}

Вышеуказанное будет вести себя одним из двух способов из-за того, как N / RVO настроен в C ++. Или tmp будут опущены и getMyObject действует непосредственно на объект результата. Или результат объекта создается путем перемещения tmp, В любом случае, вы получаете действительный объект для использования в цепочке методов.

2

По вопросам рекламы [email protected]