Есть ли у встроенных типов семантика перемещения?

Рассматривать этот код:

#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Значение изменено. Его ресурс, его личность — это то, что изменяется.

Есть ли у встроенных типов семантика перемещения?

Кроме того, объекты встроенного типа после того, как он перемещен (если это), хорошо определенное поведение?

21

Решение

И так, показанный на примере хорошо определенное поведение?

Да, поведение, показанное в примере, является единственным поведением, разрешенным стандартом. Это потому std::move не двигается То, что движется, это конструкторы перемещения и операторы присваивания перемещения.

Все std::move делает, это меняет lvalue на xvalue, чтобы он мог связываться со ссылками rvalue. Он не вызывает ни конструктора, ни чего-либо еще. Изменение категории значения происходит на уровне типа. Ничего такого происходит во время выполнения.

Rvalue ссылки по-прежнему являются ссылками: они ссылаются на исходный объект. Функция увеличивает исходное целое число через указанную ссылку.

Если функция принимает аргумент по ссылке, копирование и перемещение не выполняются: исходный объект привязан к ссылке.

Если функция принимает аргумент по значению, то мы может быть есть ход.

Однако фундаментальные типы не имеют конструкторов перемещения. В этом случае перемещения ухудшаются до копий.

45

Другие решения

Других решений пока нет …