std::p riority_queue::p op什么时候会抛出异常
When could std::priority_queue::pop throw an exception
std::priority_queue
的pop()
方法没有声明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::pop
不nothrow
?
由于从T::~T
抛出的异常会导致 UB,因此实现可以假定它不会发生,并且仍然符合标准。处理它的另一种方法是让这样的库函数nothrow(false)
而不是处理它。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- std::p riority_queue::p op什么时候会抛出异常
- 在类中抛出异常的最佳方法是什么
- 当在计算constexpr时抛出异常时会发生什么
- 在什么情况下,if语句可以抛出异常
- 有人能确切地解释一下,如果在堆上分配对象数组的过程中抛出异常,会发生什么吗
- 如果构造函数抛出异常会发生什么
- 是什么在这个文件流中抛出异常?
- 如果 c 代码"through"抛出异常会发生什么?
- 这个语法是什么意思?运算符重载和抛出异常