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.

上記のプログラムをUbuntu11.10とminGWを使用するWindowsで試しましたが、どちらも同じ結果になりました。minGWにはGCCバージョン4.5.2を使用し、Ubuntuには4.6.1を使用しています。

この奇妙な行動についての手がかりはありますか?これはgccのバグですか、それとも私のやり方が間違っていますか?

4

1 に答える 1

5
A a();

は関数宣言であり、オブジェクトのインスタンス化ではありません。オブジェクトは構築されず、コンストラクターは呼び出されず、例外はスローされません。

これは、最も厄介な解析と呼ばれます。

バグではなく、まったく問題ありません。

この二つ:

A a();
A b;

同等ではありません。A2つ目は、と呼ばれるタイプのオブジェクトを作成しますba1つ目は、引数をとらずにを返すというメソッドを宣言しますA

于 2012-05-29T11:08:01.567 に答える