【发布时间】:2013-10-19 23:23:24
【问题描述】:
在使用支持 gnu 扩展的 C++ 编译器(例如 Linux 上的 g++ 本身;C++03)时,将函数声明为 __attribute__(nothrow) 和 throw() 有什么区别。
据我了解,这两种变体都是说编译器这个函数不会抛出异常。但实现可能不同
编译器将如何使用这些信息?
如果我在 nothrow 或 throw() 函数内运行时抛出异常,并且这个异常会上升到函数中怎么办?函数会进一步传递异常还是隐藏异常或其他?
【问题讨论】:
-
__attribue__是一个编译器扩展。throw()是标准的一部分。前者可能是错误的,我认为后者已被弃用,因此不作为答案发布。 -
@JohnDibling 真的是未定义的行为吗?我以为它调用了
std::set_unexpected中指定的处理程序 -
@erikkallen 如果是
throw(),则调用std::unexpected(),如果是noexcept(true),则调用std::terminate()。 -
@erikkallen:我收回我声明的那一部分。 @简单是正确的。见 15.4/9-10。