Временный объект в C++
Временный объект живет до конца полного выражения.
Результат функции, которую объявили с типом класса по значению, как раз такой объект: у него нет отдельного имени в вызывающем коде.
Такое значение называют rvalue. Если передать его в другую функцию по значению, компилятор может вызвать конструктор перемещения вместо копирования, когда оба конструктора объявлены.
Запишем Box с сообщениями из конструкторов
копирования и перемещения, функцию make_box
и приемник take:
#include <iostream>
class Box {
public:
int* ptr;
Box() {
ptr = new int[1];
ptr[0] = 5;
}
Box(const Box& other) {
ptr = new int[1];
ptr[0] = other.ptr[0];
std::cout << "copy ctor\n";
}
Box(Box&& other) noexcept {
ptr = other.ptr;
other.ptr = nullptr;
std::cout << "move ctor\n";
}
~Box() {
delete[] ptr;
}
};
Box make_box() {
Box filled;
filled.ptr[0] = 9;
Box spare;
spare.ptr[0] = 0;
if (filled.ptr[0] > spare.ptr[0]) {
return filled;
}
return spare;
}
void take(Box item) {
std::cout << item.ptr[0] << "\n";
}
Сейчас передадим временный объект в функцию:
int main() {
take(make_box());
return 0;
}
Сделайте класс Pack с буфером из одного
int, конструкторами копирования
и перемещения с разными строками в std::cout.
Передайте результат функции, возвращающей
Pack по значению, в функцию с параметром
по значению и выведите элемент буфера.