У встроенных типов есть семантика перемещения? - программирование

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

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

#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 изменяется. Его ресурс, его я, является тем, который изменяется.

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

Кроме того, Do встроенные объекты типа после его перемещения (если есть) четко определенного поведения?

4b9b3361

Ответ 1

Итак, показан ли пример показанному правильному поведению?

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

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

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

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

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

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