Спецификация C ++ (ISO / IEC 14882: 2011 + ISO / IEC 14882: 2014) определяет в Таблицу 28 - Требования к распределителю для освобождения:
Все n T объектовв зоне, указанной p, должен быть уничтожен до этого вызова.n должен соответствовать значению, переданному для выделения для получения этой памяти.Не генерирует исключения.
Но почему освобождение все еще не noexcept?
Это узкий контракт (вызывающий неопределенное поведение, если вы передаете ему указатель, например, не возвращаемый allocate), поэтому в соответствии с обычной политикой стандартной библиотеки он не помечается как noexcept.
allocate