Вы всегда должны стремиться к базовой гарантии исключения: убедитесь, что в случае исключения все ресурсы высвобождаются правильно и объект находится в допустимом состоянии (которое может быть неопределенным, но допустимым).
Гарантия строгого исключения (т. Е. «Транзакции») - это то, что вы должны реализовать, когда считаете, что это имеет смысл: вам не всегда нужно транзакционное поведение.
Если легко выполнить транзакционные операции (например, с помощью копирования и обмена), то сделайте это.Но иногда это не так, или это оказывает большое влияние на производительность, даже для фундаментальных вещей, таких как операторы присваивания.Я помню, как реализовывал что-то вроде boost :: Вариант, где я не всегда мог обеспечить надежную гарантию в назначении копирования.
Одна огромная трудность, с которой вы столкнетесь, связана с семантикой перемещения.Вы делаете хотите транзакции при перемещении, потому что в противном случае вы потеряете перемещенный объект.Тем не менее, вы не всегда можете предоставить надежную гарантию: подумайте о std::pair<movable_nothrow, copyable>
(и посмотрите комментарии).Здесь вы должны стать виртуозом noexcept
и использовать неудобное количество метапрограммирования.С ++ трудно овладеть точно из-за безопасности исключений.