I can speak to the intention:
vector<T>::push_back(const T&);
vector<T>::push_back(T&&);
For types T that are CopyConstructible, and for types T that are noexcept MoveConstructible (whether or not they are CopyConstructible), the push_back should have the strong exception safety guarantee for all observable characteristics, including capacity, no matter whether the exception is thrown by buffer reallocation, or by a copy construction (there are no assignment operations done, and move construction can not throw in this case).
For types T that are not CopyConstructible, and have a throwing move construction, the push_back should have the basic exception safety guarantee. If an exception is thrown, the vector is left in a valid, but unspecified state. As a practical matter, I would expect such a state to be one of the following:
1. If buffer allocation throws, I would expect the vector to remain unchanged, including capacity.
2. If buffer allocation is successful, and the construction of the new element throws, I would expect the vector to remain unchanged, including capacity.
3. If buffer allocation is successful, and the construction of one of the existing elements throws (in moving from the old buffer to the new), I would expect vector capacity and size to remain unchanged, and for some of the vector's elements to be in a moved-from state.
4. If buffer allocation is unneeded, and the construction of the new element throws, I would expect the vector to remain unchanged, including capacity.
In summary, I see no reason for capacity or size to change if an exception is thrown for any reason at all. But I agree that is not what the standard says.
Howard