Этот ответ изменяется в c ++ 17 .
data getData()
{
return std::move(d);
}
Этот метод перемещает d
в его возвращаемое значение.
data x = foo.getData();
, который создает этотx
из возвращаемого значения getData
.Однако стандарт C ++ поощряет и разрешает эту конструкцию быть elided , если getData
возвращает prvalue (тип значения, который соответствует).Elision означает, что идентификатор и срок действия возвращаемого значения и x
объединены.Существует только один объект, а не два.
Это позволяет пропускать побочные эффекты, такие как операторы печати в конструкторах перемещения.
Таким образом, d
- это объект, из которого перемещен объект, и этот переход непосредственно создает x
.
Если вы измените getData
на возвращение data&&
, то в течение getData
движение не выполняется, но выполняется снаружи x
.
В c ++ 17 возвращаемое значение getData
никогда не является объектом, это prvalue, а значения prvalue в c ++ 17 больше похожи на инструкции по созданию объектов.В действительности elision больше не является обязательным.