Я думаю, вы на самом деле поняли различие между типом и категорией значения , поэтому я сосредоточусь на двух конкретных утверждениях / запросах:
Вам нужно на самом деле привести его к r-значению через std :: move (), чтобы он мог быть перемещен
В некотором роде, но не на самом деле.Приведение выражения, которое присваивает имя вашему объекту или ссылается на него, в значение r позволяет нам при разрешении перегрузки вызвать перегрузку функции, которая принимает Type&&
.Обычно мы делаем это, когда хотим передать право собственности, но это не совсем то же самое, что сделать его «приемлемым для переезда», потому что переезд может не соответствовать тому, что вы в итоге делаете.В некотором смысле это придирки, хотя я думаю, что это важно понять.Потому что:
Даже если параметр (все параметры) является lvalue, компилятор знает, что его тип является ссылкой на rvalue, так почему нужно сообщать компилятору о его перемещении?
Если вы не напишите std::move(theThing)
, или если вещь временная (уже значение r), тогда это не значение r, и поэтому она не может привязываться к ссылке на значение rvalue.Вот как все это разработано и определено.Он специально сделан таким образом, чтобы выражение lvalue, выражение, которое называет вещь, вещь, которую вы не написали std::move()
, не будет привязываться к ссылке rvalue .И поэтому либо ваша программа не будет компилироваться, либо, если возможно, вместо разрешения перегрузки будет выбрана версия функции, которая может быть const Type&
- и мы знаем, что с этим не может быть никакой передачи права собственности.
tl; dr: компилятор не не знает, что его тип является ссылкой на rvalue, потому что он не один.Так же, как вы не можете сделать int& ref = 42
, вы не можете сделать int x = 42; int&& ref = x;
.В противном случае он попытался бы переместить все !Весь смысл в том, чтобы заставить определенные виды ссылок работать только с определенными типами выражений, чтобы мы могли использовать это для запуска вызовов к функциям копирования / перемещения в зависимости от ситуации с минимальным количеством машин на площадке вызовов.