可能的重复:
为什么使用空括号集调用没有参数的构造函数会出错?
我有一个非常简单的 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中的错误,还是我的方式不正确?
A a();
Run Code Online (Sandbox Code Playgroud)
是一个函数声明,而不是一个对象实例化。没有构造对象,没有调用构造函数,没有抛出异常。
它被称为最烦人的 parse。
这不是错误,完全没问题。
这两个:
A a();
A b;
Run Code Online (Sandbox Code Playgroud)
不等价。第二个创建一个A
名为的类型的对象b
。第一个声明了一个a
不带参数并返回的方法A
。
归档时间: |
|
查看次数: |
826 次 |
最近记录: |