在 C++11 中,这已被弃用:
void foo() throw();
并替换为
void foo() noexcept;
在本文中解释了这样做的原因(其中归结为同一件事)是
C++ 异常规范是在运行时而不是在编译时检查的,因此它们不提供程序员保证所有异常都已被处理。
虽然这对我来说确实有意义,但我不明白为什么throw()
首先动态检查,或者为什么noexcept
不提供异常保证,而不是调用std::terminate
而不是正常的堆栈展开(这并不是真正的可靠保证 IMO)。
难道不能在编译期间检查是否抛出异常,如果发生这种情况,编译会失败吗?在我看来,基本上有三种情况:
void foo() noexcept
{
// 1. Trivial case
throw myexcept();
// 2. Try-catch case
// Necessary to check whether myexcept is derived
// from exception
try
{
throw myexcept();
}
catch(exception const & e)
{}
// 3. Nested function call
// Recursion necessary
bar();
}
使用 C++ 中的模板为每种类型实例化,编译应用程序无论如何都需要永远 - 那么为什么不更改noexcept
以强制编译器检查在编译期间是否抛出异常呢?
noexcept
我看到的唯一困难是一个函数可能会或可能不会抛出取决于运行时状态 - 但在我看来,无论如何都不应该允许该函数调用自己。
我是否遗漏了一些东西,或者是为了不进一步增加编译时间,还是为了让编译器开发人员轻松一些?