Это может быть отмечено nothrow
, но это не так.
Почему std::priority_queue::pop
может * не бросить
void pop();
Удаляетверхний элемент из приоритетной очереди.Эффективно звонки
std::pop_heap(c.begin(), c.end(), comp); c.pop_back();
c
по умолчанию std::vector
.
[vector.modifiers]/4&5
void pop_back();
4 / Сложность : деструктор T называется числом раз, равным количеству стертых элементов, но оператор присваивания T называется числом раз, равным числуэлементов в векторе после стертых элементов .
5 / Throws : Ничего, если только исключение не выдается оператором присваивания или оператором присваивания перемещенияT.
* Таким образом, вызывается только деструктор T
, который нельзя бросить из-за
[requirements.on.functions]/2.4
2 / В частности, эффекты не определены в следующих случаях:
[...]
2.4 / , если имеется функция замены или функция обработчика или Работа деструктора завершается через исключение , если это специально не разрешено в применимом Требуемое поведение: в год.ragraph.
Почему std::priority_queue::pop
не nothrow
?
Поскольку исключение, выброшенное из T::~T
, приведет к UB, реализация может предположить, что это не может произойти, и при этом соответствоватьк стандарту.Другой способ справиться с этим - разрешить таким функциям библиотеки nothrow(false)
и не иметь к ней отношения.