Hardcopy-and-swap
Что такое copy-and-swap идиома?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Copy-and-swap — реализация оператора присваивания через copy ctor + swap: параметр передаётся по значению (копируется или move-ается при вызове), затем swap обменивает внутренности.
class Buffer {
int* data_;
size_t n_;
friend void swap(Buffer& a, Buffer& b) noexcept {
std::swap(a.data_, b.data_);
std::swap(a.n_, b.n_);
}
public:
Buffer(const Buffer&); // copy ctor
Buffer(Buffer&&) noexcept; // move ctor
// ОДИН оператор присваивания — работает и для copy, и для move
Buffer& operator=(Buffer other) noexcept {
swap(*this, other); // other теперь держит старое состояние
return *this; // other уничтожится в конце — освободит старые данные
}
};Преимущества: автоматически работает и для copy, и для move; self-assignment обрабатывается корректно; strong exception guarantee; DRY — код копирования только в copy ctor.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.