Рассматривать этот код:
#include <iostream>
using namespace std;
void Func(int&& i) {
++i;
}
int main() {
int num = 1234;
cout << "Before: " << num << endl;
Func(std::move(num));
cout << "After: " << num << endl;
}
Его вывод:
Before: 1234
After: 1235
Очевидно, что i
изменяется внутри Func
, как это связано с параметром i
после «преобразования» в ссылку на r-значение std::move
,
Ну, моя точка зрения:
Перемещение объекта означает передачу права собственности на ресурсы из одного объекта в другой. Тем не менее, встроенные типы держит нет ресурсов, потому что они сами являются ресурсами. Нет смысла переводить ресурсы, которыми они владеют. Как показано на примере, num
Значение изменено. Его ресурс, его личность — это то, что изменяется.
Есть ли у встроенных типов семантика перемещения?
Кроме того, объекты встроенного типа после того, как он перемещен (если это), хорошо определенное поведение?
И так, показанный на примере хорошо определенное поведение?
Да, поведение, показанное в примере, является единственным поведением, разрешенным стандартом. Это потому std::move
не двигается То, что движется, это конструкторы перемещения и операторы присваивания перемещения.
Все std::move
делает, это меняет lvalue на xvalue, чтобы он мог связываться со ссылками rvalue. Он не вызывает ни конструктора, ни чего-либо еще. Изменение категории значения происходит на уровне типа. Ничего такого происходит во время выполнения.
Rvalue ссылки по-прежнему являются ссылками: они ссылаются на исходный объект. Функция увеличивает исходное целое число через указанную ссылку.
Если функция принимает аргумент по ссылке, копирование и перемещение не выполняются: исходный объект привязан к ссылке.
Если функция принимает аргумент по значению, то мы может быть есть ход.
Однако фундаментальные типы не имеют конструкторов перемещения. В этом случае перемещения ухудшаются до копий.
Других решений пока нет …