关于抛出对象的语法,我有一个普遍的问题。考虑:
#include <stdio.h>
struct bad { };
void func() {
throw bad;
}
int main(int, char**) {
try {
func();
} catch(bad) {
printf("Caught\n");
}
return 0;
}
此代码无法编译(g ++ 4.4.3),因为'throw'行必须替换为:
throw bad();
这是为什么?如果我正在创建一个堆栈分配的坏,我就像这样构建它:
bad b;
// I can't use 'bad b();' as it is mistaken for a function prototype
我已经查阅了Stroustrup的书(以及本网站),但无法找到任何对我来说似乎不一致的解释。
答案 0 :(得分:9)
throw bad;
不起作用,因为bad
是数据类型,结构(struct bad
)。你不能抛出数据类型,你需要抛出一个对象,这是一个数据类型的实例。
你需要这样做:
bad obj;
throw obj;
因为它会创建一个obj
结构的对象bad
,然后抛出该对象。
答案 1 :(得分:2)
您需要抛出结构的实例。
void func() {
bad b;
throw b;
}
答案 2 :(得分:0)
不同之处在于throw
的参数是一个对象,而不是一个类型。将变量声明为bad b
的语法为[type] [object_name];
。然后键入!= instance。