Должен ли я вернуть ссылку на 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?

Ответы на вопрос(4)

Ваш ответ на вопрос