C ++抛出语法

时间:2011-11-15 19:37:04

标签: c++

关于抛出对象的语法,我有一个普遍的问题。考虑:

#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的书(以及本网站),但无法找到任何对我来说似乎不一致的解释。

3 个答案:

答案 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。