最近,我试图回答什么,我认为将是对noexcept
例外规范simple question。最终的结果是,我发现我对noexcept
的基本理解是错误的。noexcept和可靠性保证
在阅读the current draft standard以纠正我的误解时,我发现自己问了一些关于noexcept
的问题,这些问题未回答here。
- 应该认为
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;
}
我的理解'noexcept':即使这件事情引发我不想知道。所以它对于“安全”或“正确性”并不真正起作用,它通过防止抛出异常而起作用,因此你的程序不会因此而终止。 – user2485710
如果一个异常到达标记为“noexcept”的函数的最外层,则调用std :: terminate。它根本不抑制异常。它提供了一个屏障,在这个屏障上不会抛出异常 – Mgetz
我之前写的是关于_runtime_,'noexcept'在编译时工作,所以它是编译器的一个提示,编译器评估你的程序,如果有可能抛出异常,您有机会在_runtime_之前更正此错误,因为'noexcept'运算符将在_compile time_时失败。它在某些方面类似于'type traits',你定义一个属性需要被评估为'true',如果不是编译器警告你的话,如果测试通过你知道在_runtime_你将有你的类型定义在你的'特质'条件。 'noexcept'同样的事情。 – user2485710