7

例外クラスのauto_ptrに問題があり、最終的に次のようになりました。

#include <memory>

class MyException
{
    std::auto_ptr<int> m_foo2;
};

int main()
{
    try
    {
        throw MyException();
    }
    catch (const MyException&)
    {

    }
    return 0;
}

これは次のコマンドでコンパイルできません:

/perforce/unstable/test/Common/Exceptions/TestException4.cpp:関数'int main()':/perforce/unstable/test/Common/Exceptions/TestException4.cpp:12:エラー:'の呼び出しに一致する関数がありませんMyException :: MyException(MyException)'/perforce/unstable/test/Common/Exceptions/TestException4.cpp:4:注:候補は次のとおりです:MyException :: MyException()/perforce/unstable/test/Common/Exceptions/TestException4.cpp :4:注:MyException :: MyException(MyException&)/perforce/unstable/test/Common/Exceptions/TestException4.cpp:12:エラー:スローされた式で

また、auto_ptrを削除すると、エラーはなくなります。

これは、例外がコピーまたは割り当てられているためですか?auto_ptr例外でsを使用する方法はありますか?

4

1 に答える 1

9

これは、例外がコピーまたは割り当てられているためですか?

確かにそうです。この規格は、C ++ 11 15.1/3で例外がどのようにスローされるかを指定しています。

throw-expressionは、一時オブジェクト[...]を初期化します。一時値は左辺値であり、一致するハンドラーで指定された変数を初期化するために使用されます。

初期化は、暗黙のコピーコンストラクターを使用して行われます。MyException(MyException&)非参照引数を必要とするメンバーがあるため、これはとして宣言されconstます(C ++ 11 12.8 / 9で指定されているように)。一時オブジェクトを非参照にバインドできないconstため、構築は失敗します。

例外でauto_ptrsを使用する方法はありますか?

C ++ 11を使用できる場合は、代わりに使用して、歴史の腸にunique_ptr委託することができます。auto_ptrクラスにはMyException(MyException&&)、一時的なものから初期化するために使用できる、として宣言された暗黙の移動コンストラクターがあります。

それ以外の場合は、一時的でない値をスローする可能性があります。

MyException ex;
throw ex;

または、クラスをハックconstして、明示的なコピーコンストラクターを追加し、const_castまたはmutableを使用して参照からの初期化を許可することもできますauto_ptrが、これは潜在的に危険であり、お勧めしません。

于 2012-04-05T10:52:45.433 に答える