2016-10-24 15 views
11

次は、私が試したコンパイラのカップルにコンパイルするようだ: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()とは異なる終了関数を呼び出すため、同等の動作をしません。理想的な答えは、行動の違いと、なぜこのような場合に問題があるのか​​、それとも重要でないのかを呼び出すことになります。

+0

何かが見つからないかぎり、http://stackoverflow.com/questions/5295134/exception-specification-when-overridover-a-virtual-function/5295168#5295168がこれに対応しているようです。 – Michael

+0

Biagioの答えの下のスレッドを参照してください。 throw()とnoexceptの間の振る舞いの微妙な違いは、スローされた例外の制限性にとどまらず、これを難しくしています。 – Cicada

答えて

3

あなたも、上書きせずにこれを行うことができます。

void f() throw(); 
void f() noexcept { throw 1; } 

[except.spec]/9はそれを明確に、それは何が起こるかを制御定義上の仕様であることを行います

たびタイプEの例外 ([except.handle])ハンドラを検索すると、Eを許可しない 例外指定を持つ関数の最も外側のブロックに遭遇した場合、

  • 関数定義は、ダイナミック例外仕様を有する場合、機能 std::unexpected()は([except.unexpected])と呼ばれ、

  • さもなければ、機能std::terminate()が 呼ばれます([ except.terminate])。

このためどのような特別な処理が呼び出される側ではなく、呼び出し側で起こるので、これは問題ではありません。呼び出し元が知っておく必要があることは、例外が関数を残すことはないということです。

+0

ありがとう!意味あり。 – Cicada

2

これは未定義の動作ですか?これは許可されていますか? これは許可されています。 C++標準から

仮想関数は、派生クラスの仮想関数のみを許可しなければなら をオーバーライドする任意の関数の定義を含むすべての 宣言を、例外指定されている場合オーバーライド機能が として削除されていない限り、基本クラス 仮想関数の例外仕様で許可されている例外 が含まれています。

実際には、派生クラスのメソッドをオーバーライドし、新しいクラスをベースクラスで指定されたものに追加して指定することができます。

あなたの例では、throw()noexceptは同等です。

+0

これはnoexceptとthrow()の動作の違いとどのように機能しますか?予期しない例外が発生した場合はNoexcept呼び出しが終了し、予期しない呼び出しがthrowされます。私が掲示した例のために呼ばれるでしょうか? Noexceptはスタックを巻き戻しませんが、throw()は可能性があります(コード生成に影響します)。どのように仕様のこれらの違いは、実際には例外ではないが、呼び出しているコードがthrow()であると考えるかもしれない呼び出しコードによってどのように説明されますか? – Cicada

+0

@Cicada ['unexpected'](http://en.cppreference.com/w/cpp/error/unexpected)はデフォルトで' terminate'を呼び出します。ユーザーによって指定された動作が異なる場合、私は自分で試してみます –

+1

@BiagioFesta - "未定義の動作"は "何か厄介なことをする"という意味ではありません。言語定義が何が起こるかを教えてくれないということは** **のみを意味します。 –

関連する問題