Должен ли я вернуть ссылку на rvalue (посредством std :: move'ing)?
A C ++ Следующая запись в блоге сказал, что
A compute(…)
{
A v;
…
return v;
}
ЕслиA
имеет доступный конструктор копирования или перемещения, компилятор может исключить копию. В противном случае, еслиA
имеет конструктор перемещения,v
перемещен В противном случае, еслиA
имеет конструктор копирования,v
копируется В противном случае выдается ошибка времени компиляции.
Я думал, что всегда должен возвращать значение безstd::move
потому что компилятор сможет определить лучший выбор для пользователей. Но в другом примере из поста в блоге
Matrix operator+(Matrix&& temp, Matrix&& y)
{ temp += y; return std::move(temp); }
Здесьstd::move
необходимо, потому чтоy
должен рассматриваться как lvalue внутри функции.
Ах, моя голова чуть не взорвалась после изучения этого поста. Я изо всех сил старался понять рассуждения, но чем больше я учился, тем больше смущался. Почему мы должны возвращать значение с помощьюstd::move
?