例外仕様

例外仕様とは、
  • 関数が例外仕様に記述されている例外だけを投げる(あるいは何も投げない)ことを実行時に強制する。
  • 関数が例外仕様に記述されている例外が投げられたかどうかをチェックしなければならないという前提に基づいて、コンパイラの最適化が可能にしたり阻害したりする。
[例]

int Hunc() throw(A,B)
{
    return junc();
}

例のコードは、コンパイラは下記のソースコードを生成する。

int Hunc() throw(A,B)
{
    try{
        return junc();
    }catch(A){
        throw;
    }catch(B){
        throw;
    }catch(...){
        std::unexpected();
    }
}

つまり、例外仕様は、オーバーヘッドが発生する。
だから、

ガイドライン1
例外仕様を決して書いてはならない

〔参考 一般的な例外仕様の理解〕 
int Func();            // どんな例外でも投げる可能性がある
int Gunc() throw();    // 何も投げない
int Hunc() throw(A,B)  // AまたはBだけを投げることができる

コメント

人気の投稿