#include <iostream>
using namespace std;

struct myArray;

class proxy {
	myArray &array;
	int index;
public:
    proxy(myArray &_array, int _index)
    :   array(_array)
    ,   index(_index) {
    }
    proxy& operator=(int value);
    operator int() const;
};
struct myArray {
	int data[100];
	proxy operator[](int index) {
		return proxy(*this, index);
	}
};

proxy& proxy::operator=(int value) {
	cout << "Asigning " << value << " to element " << index << endl;
	array.data[index] = value;
	return *this;
}

proxy::operator int() const {
	cout << "Reading element at " << index << endl;
	array.data[index];
}

int main() {
	myArray a;
	a[5] = 123;
	a[8] = 321;
	int x = a[5];
	return 0;
}