У каждого объекта есть свой собственный адрес. Поскольку bar
и retVal
- разные объекты, у них разные адреса. Перемещение не изменяет адрес объекта.
. Что такое перемещение, это позволяет перемещать кишки объекта с одного объекта на другой. В зависимости от того, как создается класс, это может быть очень большим повышением производительности. Например, если у нас есть класс, подобный std::vector
, он будет иметь указатель на него в выделенном хранилище. Перемещение позволяет просто скопировать указатель и размер с перемещенного объекта с перемещенного на объект. Затем вы просто устанавливаете указатель в перемещенном объекте на нулевой указатель и задаете размер 0. Теперь нам не нужно было копировать какие-либо элементы или выделять какое-либо хранилище, которое нам пришлось бы делать, если бы мы делали копию вместо .
Один из способов взглянуть на это - переместить ссылочный знак с
int &R = x;
на
int& R = x;
R
- это int&
- это ссылка на [116 ], что означает, что R
не освободит память, выделенную x
, когда R
выйдет из области видимости, но это будет ссылка на x
, пока x
живет. Настоящим объявляется R
, и его объявление не может быть изменено, поэтому, если вы попытаетесь:
<type declaration> R = <value>
, оно должно завершиться неудачей - поскольку R
уже объявлено.
Но вы можете присвоить что-либо для того, что R
является ссылкой на
R = <value>
... до тех пор, пока тип value
равен преобразуется в тип, на который ссылается R
(0-1 операторы преобразования).
Я не понимаю строку, где переменная x назначена адресу R
blockquote>int &R = x;
В приведенной выше строке объявляется
reference-to-int
с именемR
, и делает его ссылкой на уже существующую переменнуюx
. то есть в любом коде функции ниже строки,R
будет действовать как псевдоним дляx
.//int &R = &x; // ERROR!
Приведенная выше строка (когда она не закомментирована) выдает ошибку, поскольку значение в правой части
=
имеет типint *
(т.е. это указатель на int), в то время как значение на левой стороне=
имеет типint &
(то есть это ссылка на int).В C ++ ссылки действуют в некотором смысле как указатели, но с точки зрения их синтаксиса они в основном следуют тем же правилам, что и тип, на который они ссылаются - это потому, что они действуют как псевдонимы для значения этого типа , Так что в этом случае, так же как вы не можете назначить указатель на
int
, вы также не можете назначить указатель наint &
:int R = &x; // This would also be an error
Я не понимаю строку, где переменная x назначена адресу R
blockquote>Синтаксис C ++ может сбивать с толку, но то, что вы видите, не является Переменная присваивается адресу.
Здесь амперсанд имеет другое значение:
R
- это переменная типаint&
, то есть ссылка на int. Это не значит «взять адрес R». Более или менее это означает, чтоR
теперь является псевдонимомx
. Он ведет себя какint
, а не какint*
(указатель на int). Если вы напечатаете их значение, вы обнаружите, что оно одинаково, и если вы измените одно из них, вы также измените другое.Вы можете взглянуть на этот вопрос для всестороннего объяснения ссылок.