8
namespace QuantLib {

    //! Base error class
    class Error : public std::exception {
      public:
        /*! The explicit use of this constructor is not advised.
            Use the QL_FAIL macro instead.
        */
        Error(const std::string& file,
              long line,
              const std::string& functionName,
              const std::string& message = "");
        /*! the automatically generated destructor would
            not have the throw specifier.
        */
        ~Error() throw() {}
        //! returns the error message.
        const char* what() const throw ();
      private:
        boost::shared_ptr<std::string> message_;
    };

}

コメントからわかるように、クラスのデストラクタはError明示的に no-throw 指定子を持つ空の実装を提供します。

質問: これは必要ですか? それとも、コンパイラに暗黙のデストラクタを生成させるのと比較して、これは良い習慣ですか?

4

4 に答える 4

9

C ++ 11では、デストラクタは暗黙的にthrow()(タイプのメンバーまたはベースに異なる例外仕様のデストラクタがない限り)、C++11モードでコンパイルする場合は必要ありません。

C ++ 03を使用している場合は、追加することをお勧めしますが、効果があるかどうかは、実装によって非常に明確に定義されています...文書化の目的で追加することもできますが、これも一般的にはデストラクタはスローしないと仮定しました。

于 2012-05-25T14:44:21.343 に答える
5

デストラクタは、例外をスローしないように常に設計する必要があります。したがって、その意味では、単にノースローとしてマークするために空のデストラクタを宣言することにはほとんど意味がありません。

于 2012-05-25T14:44:28.590 に答える
4

throw()あなたが何を意味すると思うかによります。

標準に従って実際に意味することは、「必要に応じてこの関数へのすべての呼び出しの周り、または関数自体に追加のコードを配置して、この関数がスローされた場合に例外がキャッチされstd::unexpectedて呼び出されるようにする」ことです。

特定のコンパイラは、「スローしないという前提でこの関数の呼び出しを最適化する」ことを意味するように実装しましたが、(標準に違反して) ランタイム チェックを実装しませんでした。

したがって、それをデストラクタ (確かにスローすべきではありません) に追加して (ただし、実際にはスローしない可能性があります)、決してトリガーされるべきではないランタイム チェックを追加するため、コードのデバッグに役立つ場合があります。最適化を有効にする場合と無効にする場合があります。

于 2012-05-25T14:46:31.573 に答える
3

デストラクタには、常に暗黙的に例外仕様があります。

[class.dtor] 12.4 p3

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

[except.spec] 15.4 p14

暗黙的に宣言された特別なメンバー関数(第12節)には、例外仕様が必要です。fが暗黙的に宣言されたデフォルトコンストラクタ、コピーコンストラクタ、ムーブコンストラクタ、デストラクタ、コピー割り当て演算子、またはムーブ代入演算子である場合、その暗黙の例外仕様は、Tが例外仕様で許可されている場合にのみタイプIDTを指定します。 fの暗黙の定義によって直接呼び出される関数。fは、直接呼び出す関数がすべての例外を許可する場合はすべての例外を許可し、fは、直接呼び出すすべての関数が例外を許可しない場合は例外を許可しないものとします。

したがって、いいえ、例外仕様を使用する必要はありません。


C ++ 03では、ユーザー定義のデストラクタには暗黙の例外仕様がありませんでした。したがって、独自のデストラクタを定義する場合、適切な例外仕様を自動的に追加するためにコンパイラに依存することはできません。ただし、暗黙的に宣言されたデストラクタには、C++11と同じ暗黙の例外仕様があります。

于 2012-05-25T14:48:11.150 に答える