«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Когда возврат объекта по значению запускает конструктор перемещения?

Когда возврат объекта по значению запускает конструктор перемещения?

Опубликовано 16 ноября 2024 г.
Просматривать:593

When Does Returning an Object by Value Trigger a Move Constructor?

Возврат объекта класса из функции по значению

Рассмотрим случай, когда вы возвращаете объект класса из функции по ценить. В этом сценарии возвращаемый объект обычно считается lvalue, то есть у него есть имя и адрес в памяти. Однако при определенных обстоятельствах возвращаемый объект может рассматриваться как rvalue, временный объект без имени или адреса.

Правило неявного перемещения

C определяет неявное правило перемещения, которое может применяться при возврате объекта по значению. Это правило гласит, что при выполнении следующих условий:

  • Возвращаемое выражение является значением x (выражение, обозначающее временный объект, который не является значением lvalue).
  • Класс возвращаемый объект имеет конструктор перемещения.
  • Конструктор перемещения доступен.

В таких случаях вместо конструктор копирования. Такое поведение предназначено для оптимизации производительности за счет предотвращения ненужного копирования.

Пример 1

В этом примере возвращаемый объект i является lvalue, поэтому тест конструктора копирования( const test& z) вызывается:

class test {
public:
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test& z) { printf("test(const test&z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}

Вывод:

test()
test(const test&z)

Пример 2

Однако в следующем примере возвращаемый объект i обрабатывается как значение x, а конструктор перемещения test( test&& s) вызывается, поскольку объект является временным и конструктор перемещения жизнеспособен:

class test {
public:
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(test&& s) { printf("test(test&& s)\n"); }
};
test Some_thing() {
    test i;
    return i;
}

Вывод:

test()
test(test&& s)

Пример 3

Если конструктор перемещения не указан или явно удален, правило неявного перемещения невозможно применить, и программа не сможет скомпилироваться:

class test {
public:
    test(test&& z) = delete;
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test& z) { printf("test(const test&z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}

Заключение

При возврате объекта по значению при определенных условиях может применяться неявное правило перемещения, в результате чего вызывается конструктор перемещения. Понимание этого поведения имеет решающее значение для оптимизации кода и предотвращения ошибок компиляции.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3