最近我试图回答一个我认为是关于异常规范的简单问题。noexcept
最终的结果是我发现我的基本理解noexcept
是错误的。
在阅读当前的标准草案以纠正我的误解时,我发现自己问了一些关于这里noexcept
没有回答的问题。
- 应该
noexcept
被认为是一种安全保证,即调用时的函数不仅不会抛出而且不会破坏状态吗? - 假设 (1.) 是错误的:使用
noexcept
可移植的FailFast来终止应用程序而不进行清理以防止损坏保存状态是否正确?
对(2.)的澄清:目的只是为了防止析构函数从堆栈进一步向上调用,而noexcept
不是防止在其中展开。这是基于这样的假设,即这是一个完美的 RAII 环境,并且堆栈上的析构函数可以将全局状态刷新到持久性,从而破坏它。
不执行展开的示例:
#include <iostream>
#include <exception>
namespace{
struct foo{
void change_state() noexcept
{
// change state and fail
throw std::exception();
}
~foo(){
std::cout << "Destructor called, saved state corrupted!" <<std::endl;
}
};
}
int main(){
::std::set_terminate([](){
std::cout<< "Terminate called" <<std::endl;
});
foo f;
f.change_state();
return 0;
}