A vue de nez, tu pourrais renvoyer une référence non const sur ton i-ème élément, ce qui permettrait de le modifier:
T& operator[](int r);
Remarque à la con, aussi: tu pourrais peut-être remplacer le “int r” par un “unsigned int r”, ce qui est un peu plus safe et pratique pour le boundary check, à moins que tu veuilles autoriser des offsets négatifs…