【发布时间】:2014-10-19 14:21:29
【问题描述】:
考虑在 C 库中定义的以下函数:
void f(void (*callback)(int)) { callback(0); }
将从定义callback()的C++11程序调用,可能会抛出异常,如下:
void callback(int) { /* can I throw ? */}
try {
f(callback);
} catch (...) {
/* can the exception be caught ? */
}
我的问题是:
- 标准是否允许在从
f()调用时抛出回调?如果不是,我必须/应该使用noexcept说明符声明callback()? - 如果是,标准是否允许捕获被抛出的异常对象?
【问题讨论】:
-
不允许 C++ 异常跨越到 C 堆栈。这个结果是不确定的。
-
要符合标准,您必须将
callback声明为extern "C"。大多数实现都会让你忽略它,但严格来说,没有它,代码甚至不应该编译。 nothrow 不是必须的,只是不要扔。