Вы можете добавить еще один уровень абстракции для вашего итератора (который теперь является необработанным указателем). Если вы не обрабатываете необработанные указатели, но создаете какой-то класс итераторов вместо указателя, можно сделать недействительным итератор, итаким образом, он не контролируется, если кто-то пытается получить доступ к итератору после его удаления.
class Iterator {
Node operator*() {
if (node) return *node;
else throw Something();}
private:
Node* node;
}
Конечно, это оборачивание указателя будет стоить некоторых затрат (проверка указателя на каждую разыменовку).Так что вам придется решить, насколько безопасно вы хотите играть.Либо документ, предложенный другими, либо упаковку для безопасности.