The final word on contiguous iterators
There really isn't much to say here. This looks really good.

Typos

You have a couple typos in your code on your equality operators. You're comparing against other.p instead of other._p. 

Not restrictive enough

We have this constructor:

constexpr explicit contiguous_iterator(T* p);


But that means if we have contiguous_iterator&lt;Base&gt;, we can construct it with a Derived*. We definitely need to disallow this. 

On a similar vein, rebind&lt;U&gt; should be restricted to those Us which are the same type as T and are at least as cv-qualified. 

Add another alias

Rather than writing this:

constexpr explicit contiguous_iterator(contiguous_iterator_base&lt;std::remove_cv_t&lt;T&gt;&gt; other) noexcept : decltype(other)(other) {}


If you added a using base = contiguous_iterator_base&lt;std::remove_cv_t&lt;T&gt;&gt;;, you could write:

constexpr explicit(base other) noexcept : base(other) {}


which makes way more sense. 

Missing alias

You're using the alias templates for the type traits throughout, except you're using typename std::conditional&lt;X&gt;::type instead of std::conditional_t. 

Line widths

Some of these lines are really long! Add some line breaks.

Why?

I guess lastly... what does contiguous_iterator&lt;T&gt; accomplish that simple T* doesn't?