Исключительная безопасность С++ неявно сгенерированного оператора присваивания - программирование
Подтвердить что ты не робот

Исключительная безопасность С++ неявно сгенерированного оператора присваивания

Я понимаю, что С++ неявно сгенерированный оператор присваивания имеет членную копию (это также подтверждается этим ответом). Но если во время экземпляра-члена генерируется исключение (например, поскольку ресурс для этого элемента не может быть выделен), будет ли скопированный объект застрять в недопустимом состоянии?

Иными словами, выполняет ли неявно сгенерированный оператор присваивания только базовую гарантию, но не сильную гарантию?

Если нам нужна надежная гарантия для наших экземпляров класса, мы должны реализовать оператор присваивания вручную с помощью copy-and-swap идиомы?

4b9b3361

Ответ 1

Если вы хотите предложить гарантию исключения, а оператор присваивания по умолчанию не является нелогичным, тогда обычно вам нужно написать его.

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

Итак, вы должны оценить оператор по умолчанию для своего класса - если он может бросить, и, бросив отпуск в "недопустимое" состояние, вы должны его подавить. Или ослабить определенные инварианты класса, но это не очень полезно для пользователей.

Существует (по крайней мере) один частный случай. Если все члены данных, кроме одного, имеют нечеткое присвоение, а специальное имеет строгое исключение-безопасное назначение и является первым членом данных в классе, тогда оператор присваивания по умолчанию также будет очень безопасным. Возможно, вы захотите прокомментировать это довольно тщательно, если вы полагаетесь на это, однако, это может оказаться довольно хрупким!