Почему 2 неинициализированных std :: set :: iterator равны?
Они не инициализированы. Они являются инициализированными значениями. Итератор, инициализированный значением, является единственным: он не указывает ни на один контейнер.
Поведение чтения неинициализированного значения будет неопределенным, но это не то, что вы делаете в программе.
он не равен ни одному другому итератору в наборе
Сравнение входных итераторов определяется только для итераторов того же диапазона. Единственный итератор не указывает на тот же диапазон, что и любой не единственный итератор, поэтому сравнение не определено.
, но оно равно другим неинициализированным итераторам.
Два единственных числаитераторы всегда сравнивают равными.
Является ли это GCC-специфичной непереносимой реализацией?
Сравнение единственного итератора и не единственного числа не определено. Неопределенное поведение, как правило, «непереносимо», даже в пределах одной и той же версии компилятора (если только компилятор не определяет поведение, в этом случае оно непереносимо для других компиляторов).
Сингулярные итераторы в целом являются стандартными, поскольку C ++14 для всех прямых итераторов.