私が持っているとします:
class Foo
{
public:
virtual ~Foo()=default;
};
デフォルトのデストラクタの例外仕様は何ですか? デフォルトのデストラクタは次と同等です:
virtual ~Foo() {};
or
virtual ~Foo() throw() {};
or
virtual ~Foo() noexcept {};
C++11 標準のセクション 15.4 は、デストラクタの暗黙的な定義によって直接呼び出される関数の例外仕様に依存すると述べています。この場合、メンバーも基本クラスもないため、暗黙のデストラクタによって直接呼び出される関数はありません。これは標準のあいまいさ (または省略) ですか?
もちろん、暗黙的に throw() がある場合は、すべてのサブクラスが throw() でデストラクタを宣言する必要があるため、これは重要です。デストラクタで例外をスローするのは悪い考えだとは言わないでください。例外仕様がまったく使用されていない多くのレガシー コードを扱っています。
参考までに、私が試したとき:
class SubFoo : public Foo
{
public:
virtual ~SubFoo();
};
GCC 4.4 でエラー (例外仕様の不一致) が発生しましたが (ただし、正しいコマンド ライン スイッチがなかった可能性があることは認めます)、「11」コンパイラを使用する XCode 4.3 では発生しませんでした。