вернуть значение rvalue в качестве значения - PullRequest
0 голосов
/ 05 июня 2018

Итак, у меня есть следующий класс:

class Foo {
public:
    Bar &&bar() {
        return std::move(_bar);
    }
private:
    Bar _bar;
}

Я знаю, что этот класс допустимо использовать в следующем контексте:

Bar bar;
{
    Foo foo;
    bar = foo.bar(); // bar is move-assigned, as foo is still in scope
}

Теперь ситуация Iинтересно, что произойдет, если я напрямую верну bar из метода, не сохраняя его заранее:

Bar testFunc() {
    Foo foo;
    return foo.bar();
}

Bar test = testFunc();
// is test now valid?

Я думаю, что это должно быть теоретически нормально, так как testFunc возвращает значение, построенное изЗначение до того, как foo будет уничтожено - но так ли это, если компилятор применяет оптимизацию возвращаемого значения?

Полагаю, я немного запутался, как именно это работает ...

1 Ответ

0 голосов
/ 05 июня 2018

тест в настоящее время действителен?

Код должен быть действителен до тех пор, пока к перемещенному объекту нет доступа.

, но это все ещев случае, если компилятор применяет оптимизацию возвращаемых значений?

Bar testFunc() {
    Foo foo;          // Bar is constructed here
    return foo.bar(); // prvalue is move-constructed and copy elided
}
Bar test = testFunc(); // default ctor + move ctor (one copy elision)

В общей сложности выполняется одно удаление копии.

Удаление элемента выглядит как запах кода.Трудно судить, не зная конкретного использования, но возможно:

Bar make_bar(const Foo& foo) {
    Bar bar;
    // init bar as needed
    return bar;
}

Таким образом, оба вызова приведут к RVO.

...