Вот... Сотворил такой assignment.
my_class& operator=(const my_class& rhs)
{
struct{ char data[sizeof(*this)]; } tmp;
new(&tmp) my_class(rhs); //создаем новый временный экземпляр класса в буфере tmp.
this->~my_class();//вызываем деструктор на текущем экземпляре.
memcpy(this, &tmp, sizeof(*this));//бинарно копируем временный экземпляр в текущий.
return *this;
}
Скажу сразу: класс безопасен для бинарного копирования — т.е. он не содержит ссылок и указателей на самого себя.
По exception-safety все тоже прокатывает на ура — единственное место где может вылезти исключение — это конструктор копирования — в этом случае недоделанный временный экземпляр будет автоматически прибит а текущий экземпляр сохранит свое сотояние.
Но... Гложут смутные сомнения: все так просто и прозрачно, но я нигде еще не видел такого подхода.
Значит, ДОЛЖНЫ быть грабли. Вопрос ГДЕ?