Hardcopymoveидиомы

Чем copy-and-swap идиома полезна?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Copy-and-swap: operator= реализуется через copy constructor + swap + деструктор старого. Параметр передаётся по значению (copy или move в зависимости от аргумента), что даёт автоматически strong exception safety и единый код для copy/move assignment.

class Buffer {
    int* data_; size_t size_;
public:
    Buffer(const Buffer& other);             // copy ctor
    friend void swap(Buffer& a, Buffer& b) noexcept {
        std::swap(a.data_, b.data_);
        std::swap(a.size_, b.size_);
    }
    Buffer& operator=(Buffer other) noexcept {  // по значению!
        swap(*this, other);                    // copy уже сделан в параметре
        return *this;                          // old this уничтожится в other
    }
};

Преимущества: автоматически strong exception safety (если copy бросает, this не изменён), self-assignment безопасен, один код для copy и move. Требует noexcept swap на членах.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.