Perhaps it's just too early in the morning for me to think straight, but... I can't think of a reason why std::vector would need its elements to be assignable.

The only operation I can think of that would require the elements to be assignable is the vector's own assignment operator, but why would an operation like push_back() require invoking the assignment operator of its elements? Even in the case of a reallocation, can't the vector use placement new to copy-construct the new elements from the old ones?