
If you are checking all the preconditions yourself, why do you care if it throws or not? [ That sounds glib - but it's a serious question. ]
Why do you care if it ASSERTs, calls abort (), throws, or gets your cat pregnant?
You care because if it throws, it is incurring the runtime cost of checking whether the precondition has been met. If you also check the precondition yourself, then this runtime cost is being incurred twice, for no reason. The design choice between throwing and undefined behaviour (in release builds, where asserts become no-ops) boils down to the choice of who should check the precondition: the callee, or the caller. Tradition has favoured the caller checking the precondition whenever possible, because the caller has more information and can sometimes check more efficiently (e.g. by eliding the check altogether in cases where it already knows the precondition is met). Note that vector::push_back() throwing on out-of-memory is *not* a counterexample to this - unlike exceeding the capacity of a StaticVector, running out of memory is not a condition that can be checked beforehand by the caller. Regards, Nate