#include #include #include // requires C++23 to compile class A { long long counter = 0; public: A() : counter{0} {} A operator()() { A ret = *this; ret.counter++; return ret; } // requires C++23 to compile A operator[](int _ = 0) { A ret = *this; ret.counter--; return ret; } // friend std::ostream &operator<<(std::ostream &lhs, A const &rhs) { // lhs << rhs.counter; // return lhs; // } operator long long() { return counter; } }; int main(void) { A a; assert(a == 0); assert(a[] == -1); assert(a[]() == 0); assert(a[]()() == 1); int i = a; assert(i == 0); i = a()()(); assert(i == 3); return 0; }