Сабж. Вот есть у меня какой то хитрый контейнер и в нем есть итератор и все что положено. Я могу делать обычный цикл
for(auto I=arr.begin(); I!=arr.end(); ++I){ ... }
и внутри этого цикла знать не только сам элемент но и доп. информацию (позиция в контейнере и всяко разно - все что итератор может рассказать).
Могу сделать foreach
for(T& x:arr){ ... }
и тут я буду знать только значения элемента.
Но я могу ведь сделать такую штуку
class Arr{
...
struct Cell{
T& operator *(){...}
T* operator ->(){...}
... // всякие методы рассказывающие об элементе контейнера
};
struct iterator: public Cell{
Cell& operator *(){ return *this; }
...
};
};
и тогда
for(auto& x:arr){ ... }
мне позволит получить доступ не только к элементу но и к информации об элементе.
Из бонусов - меньше букв писать при организации цикла.
Из плохого - это как то наверное не очевидно для пользователя?
Вопрос - насколько это вообще плохое решение и почему.