默认构造函数不会抛出C ++异常?

时间:2012-05-29 11:07:02

标签: c++ exception

  

可能重复:
  Why is it an error to use an empty set of brackets to call a constructor with no arguments?

我有一个非常简单的C ++类“A”,其main构造函数在main中调用。唯一的空c'tor只会引发异常 SomeException

#include <iostream>
using namespace std;


class SomeException : public exception { };


class A {

public:
    A() {
        throw SomeException();
    }

};

int main() {
    try {
        //A a();
        A a;
        cout << "No exception." << endl;
    }
    catch (SomeException& se) {
        cout << "Caught se." << endl;
    }
}

当我调用没有像下面这样的parantheses的A的构造函数时,它会正确抛出预期的异常。

A a;

这种情况下的输出是:

$ ./a.exe
Caught se.

但是如果我使用以下语法调用c'tor,它不会抛出异常,并继续下一行,好像什么也没发生!

A a();

这种情况下的输出是......

$ ./a.exe
No exception.

我在Ubuntu 11.10以及windows usign minGW上尝试了上述程序,两者都给出了相同的结果。我使用GCC 4.5.2版本用于minGW,4.6.1用于Ubuntu。

有关这种奇怪行为的任何线索?这是gcc中的错误,还是我的方式不正确?

1 个答案:

答案 0 :(得分:4)

A a();

是函数声明,而不是对象实例化。没有构造对象,没有调用构造函数,也没有抛出异常。

它被称为最令人烦恼的解析

这不是一个错误,它完全没问题。

这两个:

A a();
A b;

不等同。第二个创建一个名为A的{​​{1}}类型的对象。第一个声明了一个名为b的方法,该方法不带参数并返回a