Are non dereferenced iterators past the "one past-the-end" iterator of an array undefined behavior?
<p>Given <code>int foo[] = {0, 1, 2, 3};</code> I want to know if iterators that point past the "one past-the-end" are invalid. For example: <code>auto bar = cend(foo) + 1;</code></p>

<p>There are a ton of complaints and warnings that this is "undefined behavior" in Stack&nbsp;Overflow questions like this: <em><a href="https://stackoverflow.com/questions/5947437/c-whats-the-result-of-iterator-integer-when-past-end-iterator">c++ what&#39;s the result of iterator + integer when past-end-iterator?</a></em> Unfortunately the only source is hand waving.</p>

<p>I'm having more and more trouble buying that, for example:</p>

<pre><code>int* bar;
</code></pre>

<p>Is uninitialized, but certainly does not invoke undefined behavior, and given enough tries I'm sure I could find an instance where the value in this uninitialized <code>bar</code> had the same value as <code>cend(foo) + 1</code>.</p>

<p>One of the big confusions here is that I am <em>not</em> asking about dereferencing <code>cend(foo) + 1</code>. <strong>I know that would be undefined behavior and the standard forbids it.</strong> But answers like this: <a href="https://stackoverflow.com/a/33675281/2642059">https://stackoverflow.com/a/33675281/2642059</a> which cite only that dereferencing such an iterator is illegal do <em>not</em> answer the question.</p>

<p>I also know that C++ only guarantees that <code>cend(foo)</code> will be valid, but it could be <code>numeric_limits&lt;int*&gt;::max()</code>, in which case <code>cend(foo) + 1</code> would overflow. I'm not interested in that case unless it is called out in the standard as the reason we can't have an iterator past the "one past-the-end". I know that <code>int*</code> really just holds an integer value, and as such is subject to overflow.</p>

<p><strong>I would like a citation from a credible source that moving an iterator beyond the "one past-the-end" element is undefined behavior.</strong></p>