14

virtual ~exception() throw() がC++ 98にあるのに、virtual ~exception() がC++ 11にある理由は何ですか?

C++11 がクラスのデストラクタをスローできるようにする設計上の決定は何exceptionですか?

ここから:

c++98:

class exception {
public:
  exception () throw();
  exception (const exception&) throw();
  exception& operator= (const exception&) throw();
  virtual ~exception() throw();
  virtual const char* what() const throw();
}

c++11:

class exception {
public:
  exception () noexcept;
  exception (const exception&) noexcept;
  exception& operator= (const exception&) noexcept;
  virtual ~exception();
  virtual const char* what() const noexcept;
}
4

1 に答える 1

28

C++ 11がクラスのデストラクタをスローできるようにする設計上の決定は何exceptionですか?

そのような設計上の決定はありませんでした (幸いなことに!)。C++11 では、明示的に宣言されたデストラクタもnoexceptデフォルトで修飾されます。これは、C++11 標準のパラグラフ 12.4/3 から明らかです。

例外仕様を持たないデストラクタの宣言は、暗黙の宣言 (15.4)と同じ例外仕様を持つと暗黙的に見なされます。

そして、暗黙の宣言が持つ例外仕様を指定する段落15.4/14から:

継承コンストラクター (12.9) および暗黙的に宣言された特別なメンバー関数 (条項 12) には、例外指定があります。がf継承コンストラクターまたは暗黙的に宣言されたデフォルト コンストラクター、コピー コンストラクター、移動コンストラクター、デストラクタ、コピー代入演算子、または移動代入演算子である場合、その暗黙的な例外仕様は、例外仕様によって許可されているT場合にのみ、型 ID を指定します。 Tf の暗黙の定義によって直接呼び出される関数の。f直接呼び出す関数がすべての例外を許可する場合はすべての例外を許可し、直接呼び出すすべての関数が例外を許可しない場合fは例外仕様を持ちnoexcept(true)ます。

一緒に、上記の2つの段落は、のデストラクタがスローしないことを保証します(あなたが引用exceptionした のデストラクタの宣言を考えると) 。exception

これは、C++11 標準の段落 18.8.1/7-8 でも明示的に述べられています。

virtual ~exception();

7効果: クラス例外のオブジェクトを破壊します。

8備考:例外をスローしません

動的な例外仕様 ( などthrow()) は C++11 では非推奨になっていることに注意してください。附属書 D の § D.4/1 によると:

dynamic-exception-specificationsの使用は非推奨です。

于 2013-05-14T10:26:11.783 に答える