std::priority_queue
的{{3}}方法未声明为noexcept
,因此理论上可能会抛出异常。但什么时候可能抛出一个异常,那些异常会是什么呢?
答案 0 :(得分:5)
可以将其标记为nothrow
,但不是
std::priority_queue::pop
* 不能抛出void pop();
从优先级队列中删除顶部元素。有效地致电
std::pop_heap(c.begin(), c.end(), comp); c.pop_back();
c
默认为std::vector
。
void pop_back();
4 / 复杂性:T的析构函数被称为等于被删除元素数的次数,但 T的赋值运算符被称为等于的次数已删除元素 之后的向量中的元素数。
5 / 引发:除非T的赋值运算符或移动赋值运算符抛出异常,否则无效。
* 所以只调用T
的析构函数,因为
[requirements.on.functions]/2.4
2 /特别是在下列情况下效果不明确:
[...]
2.4 / 如果有任何替换函数或处理函数或析构函数通过异常退出,除非在适用的必需行为:段中明确允许。< / p>
std::priority_queue::pop
不是nothrow
?由于从T::~T
抛出的异常会导致UB,因此实现可以假设它不会发生并且仍然符合标准。处理它的另一种方法是让这些库函数nothrow(false)
而不处理它。