C++ 如何为C++;作用
给定一个名为X的函数,它调用10-20个其他函数、成员函数等,我怎么可能知道函数X的noexcept是否可以指定为true?从理论上讲,我在函数X中使用的每一个可调用项都必须使用noexcept运算符才能为函数X创建有效的noexcept说明符,对吗?因此,对于任何C++11 on-up函数,我真的没有“获得”noexcept说明符的有用性。编译器通常不会深入挖掘每个可能的代码路径,以验证可能不会抛出任何东西,但如果显然可以,它可能会发出错误。例如,在函数体中显式声明C++ 如何为C++;作用,c++,exception,noexcept,C++,Exception,Noexcept,给定一个名为X的函数,它调用10-20个其他函数、成员函数等,我怎么可能知道函数X的noexcept是否可以指定为true?从理论上讲,我在函数X中使用的每一个可调用项都必须使用noexcept运算符才能为函数X创建有效的noexcept说明符,对吗?因此,对于任何C++11 on-up函数,我真的没有“获得”noexcept说明符的有用性。编译器通常不会深入挖掘每个可能的代码路径,以验证可能不会抛出任何东西,但如果显然可以,它可能会发出错误。例如,在函数体中显式声明throw语句应该是一个红旗
throw
语句应该是一个红旗
一个很大的区别是,当堆栈从内部抛出异常后一直展开到noexcept
函数时会发生什么。程序将不会继续向上传播调用堆栈,而是调用std::terminate()
。根据您认为有必要进行何种清理或错误处理,这可能是可以接受的,也可能是不可以接受的
在某些情况下,编译器将此视为提高代码效率的机会
这是你必须仔细考虑的事情,以便从中得到利用。我在关机函数中使用它作为提醒,调用析构函数和其他清理函数应该是安全的。我有责任确保情况确实如此。
noexcept
并不意味着您将只调用本身是noexcept
的函数,或者至少您以不会抛出的方式调用它们nexcept
表示函数将发出“无异常”。您可以在函数中执行任何您想要的操作
因此,您可以对任何函数应用noexcept
,而不管它在内部做什么。只是,如果你做了一些导致异常试图转义函数的事情,就会调用std::terminate
因此,当您希望限定符为true时,可以应用noexcept
限定符。或者更具体地说,当您有理由相信某段代码将检查函数并根据其异常状态执行某些操作时。“一个很大的区别是,当堆栈从内部抛出异常后一直展开到noexcept函数时会发生什么。”这是不正确的;堆栈是否展开是由实现定义的。因此“noexcept”(或“noexcept(true)”表示函数代码本身不会抛出,而不是函数抛出中的某些函数调用。我希望我读过的“noexcept”的解释是这样向我解释的。谢谢你的澄清!