Подытожу.
Трюк с
this->~X();
return *(new (this) X(x));
плох тем, что не работатает если конструктор копирования бросит исключение. Также он не работает, если кто-то унаследован от X и деструктор виртуальный. Вот тут будет весело ^_^.
и этот трюк, и трюк со swap плох, тем, что assigment может быть выполнен эффективней cctor, так как не делает освобождение и выделение, скажем памяти.
Кто может сказать что-то плохое про
X::X( X const & x )
{
// ... default init
operator =(x);
}
?
За исключением, возможно, дешевых лишних действий.