std::p riority_queue::p op什么时候会抛出异常

When could std::priority_queue::pop throw an exception

本文关键字:什么时候 抛出异常 op riority std queue      更新时间:2023-10-16

std::priority_queuepop()方法没有声明noexcept,所以理论上可能会抛出异常。但是,它何时会引发异常,这些异常可能是什么?

它可以标记为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/如果任何替换函数或处理程序函数或析构函数操作通过异常退出,除非适用的"必需行为:">段落中特别允许。

为什么std::priority_queue::popnothrow

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