Пример реализации конструктора перемещения из курса С++. Im принимает немного похожее на это:
/// Move constructor
Motorcycle::Motorcycle(Motorcycle&& ori)
: m_wheels(std::move(ori.m_wheels)),
m_speed(ori.m_speed),
m_direction(ori.m_direction)
{
ori.m_wheels = array<Wheel, 2>();
ori.m_speed = 0.0;
ori.m_direction = 0.0;
}
(m_wheels
является членом типа std::array<Wheel, 2>
, а Колесо содержит только double m_speed
и bool m_rotating
. В классе Мотоцикл t25 > и m_direction
также double
s.)
Я не совсем понимаю, почему значения ori
s должны быть очищены.
Если у Motorcycle
были какие-либо элементы указателя, которые мы хотели "украсть", то обязательно, wed должен установить ori.m_thingy = nullptr
, чтобы не, например, delete m_thingy
дважды. Но имеет ли значение, когда поля содержат сами объекты?
Я спросил друга об этом, и они указали мне на эту страницу, в котором говорится:
Перемещение конструкторов обычно "крадет" ресурсы, удерживаемые аргументом (например, указатели на объекты с динамическим распределением, файловые дескрипторы, сокеты TCP, потоки ввода-вывода, запущенные потоки и т.д.), а не копировать их и оставлять аргумент в некотором действительном, но в противном случае неопределенном состоянии. Например, переход от a
std::string
или изstd::vector
может привести к тому, что аргумент останется пустым. Однако на это поведение нельзя полагаться.
Кто определяет, какое неопределенное состояние означает? Я не вижу, как настройка скорости до 0.0
более неопределенная, чем ее оставление. И как последнее предложение в цитате говорит - код не должен полагаться на состояние перемещенного из мотоцикла в любом случае, так зачем его очищать?