#include #include class Rule { protected: Rule() = default; Rule(const Rule&) = default; Rule& operator=(const Rule&) = default; public: virtual ~Rule() = default; virtual int amount() const noexcept = 0; }; class FixedRule final : public Rule { int amount_; public: explicit FixedRule(int amount) : amount_(amount) {} int amount() const noexcept override { return amount_; } }; static_assert(!std::is_assignable::value, "The interface does not support assignment"); static_assert(std::is_copy_assignable::value, "Concrete values remain assignable"); int main() { FixedRule first(7); const FixedRule second(19); first = second; const Rule& view = first; assert(view.amount() == 19); assert(second.amount() == 19); }