gpt4 book ai didi

c++ - noexcept 和可靠性保证

转载 作者:太空狗 更新时间:2023-10-29 21:21:49 24 4
gpt4 key购买 nike

最近我试图回答我认为会是 simple question 的问题在 noexcept 异常规范上。最终结果是我发现我对 noexcept 的基本理解是错误的。

阅读时the current draft standard为了纠正我的误解,我发现自己问了一些关于 noexcept 的问题,但没有得到回答 here .

  1. 是否应该将 noexcept 视为一种安全保证,即函数在调用时不仅不会抛出而且不会破坏状态?
  2. 假设 (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;
}

Working example of noexcept

最佳答案

  1. 是的。函数不应该破坏状态、期间,无论它是否抛出。它可能想要抛出异常这一事实并不重要。 [当然,不能保证不会让程序崩溃。不过,这种行为可能应该被记录下来。 ;-)]
  2. 穆。如果函数希望通过 noexcept 抛出,则它不应该抛出异常;它应该只调用 std::terminate(或 std::abort)。

关于c++ - noexcept 和可靠性保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21830733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com