Ссылка rvalue
- это объект, на который больше нельзя ссылаться. Поскольку на объект больше не ссылаются, все, что удерживает объект, может быть видоизменено или перемещено к другому объекту, не затрагивая существующую ссылку на объект (на него больше не ссылаются). Это учитывает семантику перемещения, что означает, что вместо этого можно перемещать данные, которые обычно должны быть скопированы в другой объект.
Итак, используя приведенный вами пример кода ...
int main(int argc, char *argv[]) {
Foo x, y, z;
std::cout << "lvalue" << std::endl;
y = x.sort();
std::cout << "rvalue reference" << std::endl;
z = Foo().sort();
return 0;
}
у нас есть
default construct
default construct
default construct
lvalue
lvalue sort
copy construct
rvalue sort
copy construct
rvalue reference
default construct
rvalue sort
copy construct
Сначала произойдет lvalue
с вызываемым методом sort
, который копируется и становится ссылкой rvalue
, а затем сортируется.
ЧтоВторым случаем является то, что созданный объект по умолчанию не имеет имени, поэтому его можно рассматривать как ссылку rvalue
. Итак, метод rvalue
reference sort
вызывается напрямую.