Я собираюсь рассмотреть здесь только вопрос о семантике перемещения, потому что вы должны задавать только один вопрос за один раз. когда вы документируете постусловия, чтобы пользователи класса знали, чего ожидать.
Например, многие классы в стандартной библиотеке C ++ заявляют, что перемещенный объект находится в неопределенном, но допустимом штат. Это означает, что вы не можете делать какие-либо предположения о состоянии объекта, но вы можете спросить у объекта, каково его состояние , или вы можете вручную сбросить его в чистое состояние. («Правильный» способ сказать, что вы можете вызывать только методы объекта, которые не имеют предварительных условий.)
Я считаю, что этот маршрут был выбран, потому что наиболее эффективный способ реализации семантики перемещения - просто поменяться местами. значения целевых и исходных объектов. Обычно это хорошо, потому что во многих сценариях ios исходный объект либо будет уничтожен сразу, либо очищен вручную.
Обычно вы можете сделать это так:
Реализуйте действительный метод swap()
:
void STR_imp::swap(STR_imp & other) {
std::swap(cstr, other.cstr);
}
При назначении перемещения просто поменяйте местами:
STR_imp& STR_imp::operator=(STR_imp&& instr) {
swap(instr);
return *this;
}
В конструкции move создайте состояние по умолчанию и затем поменяйте местами:
STR_imp::STR_imp(STR_imp&& instr) : STR_imp{} {
swap(instr);
}
Этот шаблон имеет несколько преимуществ. Самое большое преимущество в том, что действительно трудно ошибиться, если ваш метод swap()
работает правильно. Другое преимущество заключается в том, что он заставляет вас поддерживать обмен, который полезен сам по себе во многих различных сценариях ios.