Вернуть объект с помощью std :: move и связать функцию - PullRequest
0 голосов
/ 23 октября 2018

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

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 ]

0 голосов
/ 23 октября 2018

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

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

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

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

MyObject
MyController::getMyObject (const otherObject & options) const
{
    MyObject tmp;
    tmp.doSometing(options);
    return tmp;
}
0 голосов
/ 23 октября 2018

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

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

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

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

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

    tmp.doSometing(options);

    return tmp;
}

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

...