Here вы можете увидеть выполнение оператора присваивания копии с Самоконтроль назначения:Является ли оператором присваивания копий с копией и обменой идиомой и проверкой самоопределения?
String & operator=(const String & s)
{
if (this != &s)
{
String(s).swap(*this); //Copy-constructor and non-throwing swap
}
// Old resources are released with the destruction of the temporary above
return *this;
}
Это хорошо для себя задания, но плохо сказывается на производительности:
- как каждый раз, когда он проверяет, как если бы заявление (I не знаю, насколько это будет оптимально, учитывая предсказание ветви)
- Также мы теряем здесь копию elision для аргументов r
Так что я до сих пор не понимаю, буду ли я реализовывать 's operator=
, как бы я его реализовал.
Если вы не выполняете самопроверку, чем в случае примера присваивания: 'A = A;' значение объекта 'A' будет удалено. Насколько я знаю, большая реализация операции оператора присваивания для самообучения –
Почему это будет удалено? Вы можете реализовать его таким образом, чтобы он по-прежнему был безопасным, но вы не проверяете самоопределение. – Narek
позволяет сказать, что 'A' содержит значения в куче. первым шагом будет удаление этих значений и добавление к нему значений rvalue. но поскольку эти значения совпадают, вы уже удалили их. –