【问题标题】:When can std::vector::pop_back throw an exception [duplicate]std::vector::pop_back 什么时候可以抛出异常[重复]
【发布时间】:2019-09-01 21:05:14
【问题描述】:

我惊讶地发现标准 C++ std::vector::pop_back() mutator 不是 noexcept,因此允许抛出异常。很惊讶,因为它是一个销毁类型的操作,应该永远不需要分配任何资源。

它在练习时会抛出异常吗?是否允许抛出异常仅传播由向量的最后一个元素的析构函数抛出的异常?所以一个 std::vector 持有一个行为正确的类的值,它有一个 noexcept 析构函数,不会从 pop_back() 抛出异常?

【问题讨论】:

    标签: c++ exception vector


    【解决方案1】:

    不是noexcept,因为它是狭义的合同。

    如果您尝试pop_back 一个空向量,则行为未定义,调试模式实现可能会选择抛出异常。

    标准库调用的析构函数不能抛出未定义的行为。

    【讨论】:

    • 我不确定我是否同意。该语言不关心在 UB 上发生的事情。该标准仅定义了定义的行为会发生什么。另一方面,我明白你的意思。如果他们选择这样做,实现将很难在 UB 上抛出。仍然我个人的感觉是这不是它不是noexcept的原因。
    • @bolov 一个实现可能出于某种原因希望在违反先决条件时抛出异常,这是 Lakos 规则的标准理由,一直回到 N3248,这是N3279的前身。
    • 非常有趣的阅读,谢谢。我的立场是正确的。
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多