Вам нужно std::move
для "распространения" rvalue-reference-ness.
Внутри тела следующей функции:
void foo(int&& x);
… выражение x
- это lvalue int
. Не int&&
.
Ссылки на самом деле «не существуют» - даже если они поддерживаются системой типов, они должны рассматриваться как псевдонимы (а не отдельные объекты), поэтому использование x
внутри foo
обрабатывается так же, как использование оригинала, упомянутого int
внутри foo
... и при этом также создает копию, как вы знаете.
Это выполнит работу:
Product(Integer&& xId)
: dId(std::move(xId))
{}
Однако я действительно рекомендую вам брать Integer
по значению:
Product(Integer xId)
: dId(std::move(xId))
{}
Таким образом, вы можете использовать тот же конструктор для передачи lvalue Integer
тоже, и будет создана копия , если необходимо , тогда как перемещение произойдет автоматически, если нет (например, путем передачи литерала, который автоматически инициирует выбор Integer
) конструктор перемещения).