Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Возвращает висячую ссылку, как в случае с lvalue. После возврата из функции временный объект будет разрушен. Вы должны вернуть Beta_ab
по значению, как показано ниже
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
Теперь он правильно перемещает временный объект Beta_ab
в возвращаемое значение функции. Если компилятор может, он полностью избежит перемещения, используя RVO (оптимизация возвращаемого значения). Теперь вы можете сделать следующее
Beta_ab ab = others.toAB();
И он переместит конструкцию временного в ab
, или сделает RVO, чтобы вообще не делать ход или копировать. Я рекомендую вам прочитать BoostCon09 Rvalue References 101 , который объясняет суть вопроса и как (N) RVO взаимодействует с этим.
Ваш случай возврата ссылки на rvalue был бы хорошей идеей в других случаях. Представьте, что у вас есть функция getAB()
, которую вы часто вызываете на временной основе. Не оптимально, чтобы он возвращал постоянную ссылку для временных значений rvalue. Вы можете реализовать это так
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
Обратите внимание, что move
в этом случае не является обязательным, поскольку ab
не является ни локальным автоматическим, ни временным значением. Теперь ref-qualifier &&
говорит, что вторая функция вызывается для временных значений rvalue, делая следующий шаг вместо копии
Beta_ab ab = Beta().getAB();