默认构造函数不会引发 C++ 异常?

Mop*_*ath 1 c++ exception

可能的重复:
为什么使用空括号集调用没有参数的构造函数会出错?

我有一个非常简单的 C++ 类“A”,它的空构造函数在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

A a;
Run Code Online (Sandbox Code Playgroud)

这种情况下的输出是:

$ ./a.exe
Caught se.
Run Code Online (Sandbox Code Playgroud)

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

A a();
Run Code Online (Sandbox Code Playgroud)

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

$ ./a.exe
No exception.
Run Code Online (Sandbox Code Playgroud)

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

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

Luc*_*ore 5

A a();
Run Code Online (Sandbox Code Playgroud)

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

它被称为最烦人的 parse

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

这两个:

A a();
A b;
Run Code Online (Sandbox Code Playgroud)

不等价。第二个创建一个A名为的类型的对象b。第一个声明了一个a不带参数并返回的方法A