foo(std::move(a));
}
если я не напишу в сигнатуре foo rvalue ссылку, то а все равно скопируется?
То ссылка привяжется к объекту под a на вызывающей стороне. && сущностно такая же ссылка, просто с другими правилами инициализации.
Я правильно понимаю, в foo вызовется move конструктор а от rvalue значения?
void f ( S& ) { } void f ( S&& ) { } /* ... */ S s; f(s) /* #1 */: f(std::move(s)) /* #2 */; Между #1 и #2 нет никакой разницы. Ни в одном из случаев не вызываются никакие конструкторы. Но std::move() разрешает перегрузку в пользу второй реализации, тогда как f(s) приводит к вызову первой. std::move() - инструмент изменения типа выражения, который влияет на разрешение перегрузок, в т.ч. конструкторов и операторов присваивания. И уже на пользовательском уровне за && закрепляется семантика перемещения (что объект под аргументом вызываемой стороне допустимо приводить к состоянию, из которого возможно только разрушение и больше ничего).
то есть вот так
Не будет копирования, переменная a, если умеет, мувнется. Если не умеет - скопируется. Вот и все.
Обсуждают сегодня