c++ noexcept

1567 ワード

c++標準11の前に、c++は関数宣言にexception機能を有し、関数が投げ出す異常タイプを指定する.
void func1() throw(runtime_error);//runtimeを投げ出すかもしれない_errorの異常
void func2() throw();//異常を投げ出さない
void func3();//異常を投げ出すことができる
関数が例外の説明にリストされていない例外を投げ出した場合、コンパイラは標準ライブラリ関数unexpectedを呼び出します.デフォルトでは、unexcepted関数はterminate関数終了プログラムを呼び出します.
このような異常宣言の機能はあまり使用されないため、c++11では廃棄され、c++11ではnoexceptが導入され、具体的な使い方は以下の通りである.
void func4 noexcept;
Noexceptの機能は上のthrow()に相当し,関数が異常を投げ出さないことを示す.noexcept修飾関数が例外を投げ出した場合、コンパイラはstd::terminate()を直接呼び出してプログラムの実行を終了することを選択することができ、noexceptはthrow()よりも効率が高い.
一部のコードはnoexceptとthrow()の関係を説明する:(c++config.h)
// Macro for noexcept, to support in mixed 03/0x mode.
#ifndef _GLIBCXX_NOEXCEPT
# if __cplusplus >= 201103L
#  define _GLIBCXX_NOEXCEPT noexcept
#  define _GLIBCXX_USE_NOEXCEPT noexcept
#  define _GLIBCXX_THROW(_EXC)
# else
#  define _GLIBCXX_NOEXCEPT
#  define _GLIBCXX_USE_NOEXCEPT throw()
#  define _GLIBCXX_THROW(_EXC) throw(_EXC)
# endif
#endif