35

デストラクタとnoexcept. 私の理解では、C++ 11 では、ユーザー定義を含むすべてのデストラクタはnoexcept(true)、たとえそれthrowからであっても、暗黙的に です。noexcept(false)そして、何らかの理由でそのようにしたい場合は、明示的に指定する必要があります。

GCC 4.7.2 では、ユーザー定義のデストラクタは、クラスとデストラクタがどれほどプリミティブであっても、暗黙的にnoexcept(false)です。ここで何が欠けていますか?ユーザー定義のデストラクタに関する隠れた落とし穴はありますか?

4

1 に答える 1

21

これは既知のバグ(バグ レポートを見つけた OP の功績) であり、GCC 4.8.0 で修正されたようです。たとえば、以下の静的アサーションは GCC 4.7.2 では発生しますが、GCC 4.8.0 では発生しません。

struct X
{
    ~X() { };
};

int main()
{
    X x;

    // This will not fire even in GCC 4.7.2 if the destructor is
    // explicitly marked as noexcept(true)
    static_assert(noexcept(x.~X()), "Ouch!");
}
于 2013-03-30T17:55:07.297 に答える