11

私には不明ないくつかの例外の問題に遭遇しました。C++ では、オブジェクトがスローされると、最初に一時オブジェクトにコピーされ、次に一時オブジェクトがキャッチ コードに渡されます。コピーには、オブジェクトのクラス コピー コンストラクターの使用が含まれます。私の知る限り、これは、クラスにプライベートコピーコンストラクターがある場合、例外として使用できないことを意味します。ただし、VS2010 では、次のコードがコンパイルされて実行されます。

class Except
{
    Except(const Except& other) { i = 2; }
public:
    int i;
    Except() : i(1) {}
};

int main()
{
    try
    {
        Except ex1;
        throw ex1;          // private copy constructor is invoked
    }
    catch (Except& ex2)
    {
        assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
    }
    return 0;
}

これは合法ですか?

4

2 に答える 2

13

それは合法ではありません。標準 15.1/5

一時オブジェクトの使用に関連するコンストラクタとデストラクタの実行を除いて、プログラムの意味を変更せずに一時オブジェクトの使用を排除できる場合 (12.2)、ハンドラ内の例外を引数で直接初期化できます。投げ式の。スローされたオブジェクトがクラス オブジェクトであり、一時コピーの初期化に使用されるコピー コンストラクターにアクセスできない場合、プログラムの形式は正しくありません(一時オブジェクトを別の方法で削除できる場合でも)。同様に、そのオブジェクトのデストラクタにアクセスできない場合、プログラムの形式は正しくありません (一時オブジェクトを別の方法で削除できたとしても)。

于 2012-04-11T10:05:29.023 に答える
2

いいえ、ちがいます。

15.1.5 スローされたオブジェクトがクラス オブジェクトの場合、コピー/移動操作が省略されていても、コピー/移動コンストラクターとデストラクタにアクセスできる必要があります。

于 2012-04-11T10:06:07.160 に答える