Могу ли я использовать размещение new (this) в operator =?

Справочная информация: У меня сложный класс с множеством переменных. У меня есть надежный и проверенный конструктор копирования:

Applepie::Applepie( const Applepie &copy) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}

Некоторые конструкторы копирования переменных-членов, вызываемые в списке инициализатора, выполняют распределение.

Вопрос: Мне нужно создать operator = . Вместо того, чтобы дублировать существующий конструктор с присваиванием вместо списка инициализации и освобождением памяти, которая заменяется, и т. Д. И т. Д., Могу я просто сделать следующее:

Applepie& Applepie::operator=( const Applepie &copy)
{
    if( this != &copy)
    {
       this->~Applepie(); // release own object
       new(this) Applepie(copy); // placement new copy constructor
    }
    return *this;
}

Другими словами, это уничтожить себя, за которым семантически следует размещение нового конструктора копирования идентично operator =?

Это, по-видимому, потенциально может значительно сократить количество повторений кода и подтвердить, что каждая переменная инициализирована правильно, за счет возможной небольшой потери эффективности во время присваивания. Мне не хватает чего-то более непонятного?

Обоснование: В моем текущем классе около 30 вариантов. Меня беспокоит тот факт, что и мой конструктор копирования, и мой оператор присваивания должны копировать все тридцать, и что код может отличаться, в результате чего две операции будут действовать по-разному.

9
задан jcwenger 24 August 2011 в 15:38
поделиться