什么时候std :: priority_queue :: pop抛出异常

时间:2018-06-07 11:29:36

标签: c++ priority-queue c++-standard-library noexcept

std::priority_queue的{​​{3}}方法未声明为noexcept,因此理论上可能会抛出异常。但什么时候可能抛出一个异常,那些异常会是什么呢?

1 个答案:

答案 0 :(得分:5)

可以将其标记为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 / 引发:除非T的赋值运算符或移动赋值运算符抛出异常,否则无效。

* 所以只调用T的析构函数,因为

而无法抛出
  

[requirements.on.functions]/2.4

     

2 /特别是在下列情况下效果不明确:
  [...]
  2.4 / 如果有任何替换函数或处理函数或析构函数通过异常退出,除非在适用的必需行为:段中明确允许。< / p>

为什么std::priority_queue::pop不是nothrow

由于从T::~T抛出的异常会导致UB,因此实现可以假设它不会发生并且仍然符合标准。处理它的另一种方法是让这些库函数nothrow(false)而不处理它。