可能重复:
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中的错误,还是我的方式不正确?
答案 0 :(得分:4)
A a();
是函数声明,而不是对象实例化。没有构造对象,没有调用构造函数,也没有抛出异常。
它被称为最令人烦恼的解析。
这不是一个错误,它完全没问题。
这两个:
A a();
A b;
不等同。第二个创建一个名为A
的{{1}}类型的对象。第一个声明了一个名为b
的方法,该方法不带参数并返回a
。