Возможно, вы путаете типы , объекты и выражения .Только выражений имеют понятие lvalue / rvalueness.Выражение foo();
является значением типа X
.Таким образом, оператор x = foo();
вызовет - если возможно - функцию-член X::operator=(X &&)
из x
.В противном случае он будет привязан к стандарту X::operator=(X const &)
, поскольку rvalues привязываются к const-ссылкам.
Обратите внимание, что теоретически возможно иметь постоянные значения rval, например, если у вас была функция, объявленная как X const bar();
.Тогда bar()
не будет связываться с X&&
, а только с X const &&
(а также с X const &
).Однако на практике это бесполезно.