Вернуть объект с помощью 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" является подвижным.

2 ответа

Решение

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

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

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

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

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, В любом случае, вы получаете действительный объект для использования в цепочке методов.

Другие вопросы по тегам