次は、私が試したコンパイラのカップルにコンパイルするようだ:C++標準では、noexceptでthrow()関数をオーバーライドすると何が言えますか?
class A
{
public:
virtual void foo() throw() = 0;
};
class B : public A
{
public:
virtual void foo() noexcept override { }
};
1が新しいnoexcept仕様に投()関数をオーバーライドすることができているようです。私はまた、逆(noexceptをthrow()でオーバーライド)しようとしたが、それは動作するようだ。何故ですか?これは未定義の動作ですか?これは許可されていますか?
コード生成はnoexcept vs throw()の影響を受けることに注意してください。また、noexceptはthrow()とは異なる終了関数を呼び出すため、同等の動作をしません。理想的な答えは、行動の違いと、なぜこのような場合に問題があるのか、それとも重要でないのかを呼び出すことになります。
何かが見つからないかぎり、http://stackoverflow.com/questions/5295134/exception-specification-when-overridover-a-virtual-function/5295168#5295168がこれに対応しているようです。 – Michael
Biagioの答えの下のスレッドを参照してください。 throw()とnoexceptの間の振る舞いの微妙な違いは、スローされた例外の制限性にとどまらず、これを難しくしています。 – Cicada