#include #include #include #include #include #include class Scores { std::vector values_; public: explicit Scores(std::initializer_list values) { replace(std::vector(values)); } Scores(const Scores&) = default; void swap(Scores& other) noexcept { values_.swap(other.values_); } Scores& operator=(const Scores& other) { Scores temporary(other); swap(temporary); return *this; } void replace(std::vector candidate) { for (int value : candidate) { if (value < 0) { throw std::invalid_argument("negative score"); } } values_.swap(candidate); } const std::vector& values() const noexcept { return values_; } }; int main() { Scores scores{10, 20}; const auto before = scores.values(); bool rejected = false; try { scores.replace({30, -1}); } catch (const std::invalid_argument&) { rejected = true; } assert(rejected); assert(scores.values() == before); Scores replacement{40, 50}; scores = replacement; assert(scores.values() == replacement.values()); const Scores& same = scores; scores = same; assert((scores.values() == std::vector{40, 50})); scores.replace({60}); assert((scores.values() == std::vector{60})); static_assert(noexcept(scores.swap(replacement)), "commit must not throw"); std::cout << scores.values().front() << '\n'; }