1

可能重复:
为什么使用空括号调用不带参数的构造函数是错误的?

我有一个非常简单的 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;
    }
}

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

A a;

这种情况下的输出是:

$ ./a.exe
Caught se.

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

A a();

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

$ ./a.exe
No exception.

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

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

4

1 回答 1

5
A a();

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

它被称为最令人头疼的 parse

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

这两个:

A a();
A b;

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

于 2012-05-29T11:08:01.567 回答