【问题标题】:How can noexcept possibly be specified for a C++ function?如何为 C++ 函数指定 noexcept ?
【发布时间】:2020-04-02 05:19:39
【问题描述】:

给定一个名为 X 的函数,它调用了大约 10-20 个其他函数、成员函数等,我怎么可能知道 noexcept 是否可以为函数 X 指定为真?理论上我不是必须对我在函数 X 中使用的每个可调用对象都使用 noexcept 运算符来为函数 X 创建一个有效的 noexcept 说明符吗?正因为如此,对于任何 C++11 on up 函数,我真的没有“理解” noexcept 说明符的用处。

【问题讨论】:

    标签: c++ exception noexcept


    【解决方案1】:

    noexcept 并不意味着您只会调用本身为noexcept 的函数,或者至少您以不会抛出异常的方式调用它们。 nexcept 表示该函数将发出“无异常”。你可以在函数做任何你想做的事情。

    因此,您可以将noexcept 应用于任何函数,无论它在内部做什么。只是,如果你做了一些导致异常试图逃逸函数的事情,就会调用std::terminate

    因此,当您希望它为真时,您可以应用 noexcept 限定符。或者更具体地说,当您有理由相信某些代码会检查函数并根据其异常状态执行某些操作时。

    【讨论】:

    • 所以 'noexcept' (或 'noexcept(true)' )意味着函数代码本身不会抛出,而不是函数抛出中的某些函数调用。我希望我读过的“noexcept”的解释能以这种方式向我解释。感谢您的澄清!
    【解决方案2】:

    编译器通常不会深入挖掘每个可能的代码路径来验证不会抛出任何东西,但如果它显然可以,它可能会发出错误。例如,在函数体内显式声明throw 语句应该是一个危险信号。

    一个很大的不同是当堆栈从内部抛出异常后一直展开到noexcept 函数时会发生什么。该程序不会继续向上传播调用堆栈,而是调用std::terminate()。根据您认为需要进行何种清理或错误处理,这可能是可接受的,也可能是不可接受的。

    在某些情况下,编译器将此视为提高代码效率的机会。

    您必须仔细考虑才能充分利用它。我在我的关闭函数中使用它来提醒它应该可以安全地调用析构函数和其他清理函数。我有责任确保确实如此。

    【讨论】:

    • "一个很大的不同是,在从内部抛出异常后,堆栈一直展开到 noexcept 函数时会发生什么。" 这是不正确的;堆栈是否展开由实现定义。
    猜你喜欢
    • 2016-06-03
    • 2015-02-13
    • 2015-02-13
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多