2012-05-29 41 views
1

可能重复:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?对于默认构造函数,C++异常不会被引发?

我有一个非常简单的C++类 “A”,其空构造主被调用。唯一的空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的构造函数没有类似下面的parantheses时,它正确地引发了预期的异常。

A a; 

在这种情况下的输出是:

$ ./a.exe 
Caught se. 

但如果我调用与下面的语法c'tor,它不会抛出异常,并继续下一行,仿佛什么发生了!

A a(); 

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

$ ./a.exe 
No exception. 

我试图在Ubuntu 11.10并且还取决于usign MINGW窗口上面的程序,并且两个给相同的结果。我在minGW上使用GCC版本4.5.2,在Ubuntu上使用4.6.1。

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

+3

你刚刚发现[最令人烦恼的解析](http://stackoverflow.com/questions/180172/why-is-it-an-error-to-use-an-empty-set-of-brackets-到呼叫一个构造函数与 - 没有)! –

+0

我的不好。我应该调用它作为 A a = A();而不是A a();虽然该程序与后来的声明一起编译,但它不能按预期工作。 –

+0

Thanx Martinho,我正在阅读你的链接.. –

回答

4
A a(); 

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

它被称为最令人头痛的解析

这不是一个错误,它是完美的。

这两个:

A a(); 
A b; 

是不等价的。第二个创建名为bA类型的对象。第一个声明了一个名为a的方法,它不接受任何参数并返回A