#include #include class Transaction { int& target_; int& closed_; int pending_; public: Transaction(int& target, int& closed, int value) : target_(target), closed_(closed), pending_(value) {} Transaction(const Transaction&) = delete; Transaction& operator=(const Transaction&) = delete; void commit() { if (pending_ < 0) throw std::invalid_argument("negative value"); target_ = pending_; } ~Transaction() noexcept { ++closed_; } }; int main() { int value = 4; int closed = 0; bool caught = false; try { Transaction transaction(value, closed, -1); transaction.commit(); } catch (const std::invalid_argument&) { caught = true; } assert(caught && value == 4 && closed == 1); { Transaction transaction(value, closed, 9); transaction.commit(); } assert(value == 9 && closed == 2); }