iterator_const_reference_t реализован следующим образом:
template<std::indirectly_readable T>
using iter_const_reference_t = std::common_reference_t<const std::iter_value_t<T> &&,
std::iter_reference_t<T>>;
Но почему? Почему не просто: std::add_const_t<std::iter_reference_t<T>>?





add_const_t<int&> по-прежнему будет int&, что не является константной ссылкой. Вы, вероятно, имеете в виду const iter_value_t<T>&, но это может привести к висячим проблемам.
Формула в вашем вопросе взята из диапазона/v3, который существует уже много лет и может обрабатывать практически все случаи, включая ссылки на прокси.
Например, ссылку на итератор zip_view, а именно tuple<int&, int&>, нельзя сделать константной ссылкой, просто добавив квалификатор const верхнего уровня.
В этом случае мы можем применить специализацию common_reference к tuple, чтобы создать правильный ссылочный тип, т. е. tuple<const int&, const int&>, поэтому формула iter_const_reference_t имеет часть common_reference.
std::add_const_t<T &>— это простоT &, перед применением необходимо удалить ссылку. Но, вероятно, этого тоже недостаточно, потому чтоiter_reference_tне обязательно должен быть настоящей ссылкой.