C++ C++;例外情况不存在';默认构造函数不会被抛出吗?

C++ C++;例外情况不存在';默认构造函数不会被抛出吗?,c++,exception,C++,Exception,可能重复: 我有一个非常简单的C++类“A”,它的空构造函数在主体中被调用。唯一的空c'tor只是抛出一个异常SomeException #include <iostream> using namespace std; class SomeException : public exception { }; class A { public: A() { throw SomeException(); } }; int main() {

可能重复:

我有一个非常简单的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.exe
Caught se.
但如果我用下面的语法调用c'tor,它不会抛出异常,并继续到下一行,就好像什么都没发生一样

A a();
本例中的输出是

$ ./a.exe
No exception.
我在Ubuntu11.10和WindowsUsignMingw上尝试了上述程序,两个程序都给出了相同的结果。我对minGW使用GCC版本4.5.2,对Ubuntu使用GCC版本4.6.1

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

A a();
是函数声明,而不是对象实例化。没有构造对象,没有调用构造函数,没有引发异常

它被称为最烦人的解析

#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 b;
它们并不等同。第二个创建一个类型为
A
的对象,称为
b
。第一个声明了一个名为
a
的方法,该方法不接受任何参数并返回
a

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

它被称为最烦人的解析

#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 b;

它们并不等同。第二个创建一个类型为
A
的对象,称为
b
。第一个声明了一个名为
a
的方法,该方法不接受任何参数,并返回刚刚发现的
a

!我的错。我应该把它作为A=A()调用;而不是A();虽然程序是用后面的声明编译的,但它并没有像预期的那样工作。Thanx Martinho,我正在阅读你的链接..你刚刚发现了!我的错。我应该把它作为A=A()调用;而不是A();虽然这个程序是用后面的声明编译的,但它并没有像预期的那样工作。Thanx Martinho,我正在阅读你的链接。。