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

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

Другими словами, неявно генерируемый оператор присваивания достигает только основная гарантия, но не сильная гарантия?

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

14

Решение

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

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

Таким образом, вы должны оценить оператор по умолчанию для вашего класса — если он может бросить, и бросив оставьте объект в «недопустимом» состоянии, то вы должны подавить его. Или ослабить определенные инварианты классов, но это не очень полезно для пользователей.

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

10

Другие решения

Других решений пока нет …