You also asked why there is a need for both reserve() and resize(),
which is another formulation of the same question.
I gave the answer and the rationale for it.
If you want to try and find an exception for a special case of some
specifically qualified clause of some sort (and if you are willing to
bet your job on it), go ahead and have fun diving into the 1800+ pages
of legalese of the standard.
A word of advise: a quick look at [intro.object] shows:
1. An object is created by a definition (6.2), by a new-expression
(7.6.2.7), by an operation that implicitly creates objects (see below),
when implicitly changing the active member of a union (11.5), or when a
temporary object is created (7.3.4, 6.7.7)
Now you may want to look into "implicitly created objects":
13. "[Note: Some functions in the C++ standard library implicitly create
objects (20.10.9.2, 20.10.12, 21.5.3, 26.5.3). —end note]"
Then you are referenced a.o. to 20.10.9.2 [allocator.traits.members]
[[nodiscard]] static constexpr pointer allocate(Alloc& a, size_type n);
1. Returns: a.allocate(n).
Which redirects you to Allocator::allocate; for the default allocator
you have [allocator.members]:
[[nodiscard]] constexpr T* allocate(size_t n);
2 Mandates: T is not an incomplete type (6.8).
3 Returns: A pointer to the initial element of an array of n T.
4 Remarks: The storage for the array is obtained by calling
::operator new (17.6.2), but it is unspecified when or how often this
function is called. This function starts the lifetime of the array
object, but not that of any of the array elements.
Note the last sentence: "This function starts the lifetime of the array
object, but not that of any of the array elements"
Obviously it's perfectly possible that that's not the end of it.
Have fun!