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

Rae*_*ald 4 c++ priority-queue c++-standard-library noexcept

pop()方法std::priority_queue不宣noexcept,所以理论上可以抛出一个异常.但什么时候可能会抛出异常,那些异常会是什么?

YSC*_*YSC 5

它可以被标记nothrow,但不是.

为什么std::priority_queue::pop*不丢

void pop();
Run Code Online (Sandbox Code Playgroud)

从优先级队列中删除顶部元素.有效地打电话

std::pop_heap(c.begin(), c.end(), comp); c.pop_back();
Run Code Online (Sandbox Code Playgroud)

c默认情况下是std::vector.

[vector.modifiers]/4&5

void pop_back();
Run Code Online (Sandbox Code Playgroud)

4/复杂度:T的析构函数被称为等于被擦除元素数的次数,但T的赋值运算符被称为等于擦除元素之后的向量中元素数的次数.

5/抛出:除非T的赋值运算符或移动赋值运算符抛出异常,否则无效.

*所以只有析构函数T被调用,而且因为它而不能抛出

[requirements.on.functions]/2.4

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

为什么std::priority_queue::popnothrow呢?

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