gpt4 book ai didi

c++ - 异常行为 C++14 与 C++98

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:24 25 4
gpt4 key购买 nike

我写了下面的程序

#include <iostream>
#include <stdexcept>

class Myclass
{
public:
~Myclass()
{
//throw std::runtime_error("second (in destructor)");
throw 1;
}
};

void fun()
{
Myclass obj;
}
int main()
{
try
{
fun();
}
catch (const std::exception& e)
{
std::cout << e.what();
}
catch(...)
{
std::cout << " ... default Catch" << std::endl;
}
std::cout << "Normal" << std::endl;
return 0;
}

当我在 C++98 模式 (cpp.sh) 中运行上面的程序时,它会打印

 ... default Catch
Normal

当我以 C++14 模式运行它时,它不打印任何内容。 为什么这种行为会发生变化?

我确实理解,每当发生任何异常并且任何析构函数(在堆栈展开过程中)抛出任何异常时,它都会终止应用程序。但是这里只有一次异常是从 destructortry block 中抛出的。

最佳答案

自 C++11 起,没有明确说明异常规范的析构函数与默认生成的析构函数具有相同的异常规范。在您的情况下,默认生成的析构函数将是 noexcept(大多数默认生成的析构函数都是)​​,因此您的析构函数也被视为 noexcept。从 noexcept 函数中抛出会自动调用 std::terminate

如果您希望异常可捕获,请将析构函数声明为抛出:

~Myclass() noexcept(false)
{
//throw std::runtime_error("second (in destructor)");
throw 1;
}

但在你这样做之前,重新考虑一下。这是一个 bad idea to have throwing destructors .

关于c++ - 异常行为 C++14 与 C++98,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43472757/

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