Когда std :: priority_queue :: pop может выдать исключение - PullRequest
0 голосов
/ 07 июня 2018

Метод *1001*pop() не объявлен noexcept, поэтому теоретически может выдать исключение.Но когда это может вызвать исключение, и что это могут быть за исключения?

1 Ответ

0 голосов
/ 07 июня 2018

Это может быть отмечено 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) и не иметь к ней отношения.

...