
92
|
3 章 現代の C++ への移行
数も含め)、例外を発生させうると明示された場合です(すなわち「noexcept(false)」と宣言され
ている場合)。このようなデストラクタは滅多にありません。標準ライブラリには 1 つもありません
し、もし標準ライブラリが使用するオブジェクトのデストラクタが例外を発生させると(コンテナ
内に存在する、アルゴリズムに渡されたなど)、プログラムの動作は未定義となります。
関数インタフェースはコード利用者と開発者間の一種の契約と言えますが、ライブラリインタ
フェース設計者が、範囲が広い契約(wide contract)の関数と、範囲が狭い契約(narrow contract)
の関数を区別する点は注目に値します。範囲が広い契約の関数とは事前条件を何も設けない関数で
す。この種の関数はプログラムの状態とは無関係に呼び出される可能性があり、また、渡される実
引数にも何ら制約を課しません8。範囲が広い契約の関数が未定義動作を示すことはありません。
範囲が広い契約ではない関数は範囲が狭い契約という性質になり、この種の関数では、事前条件
を満たしていない場合に結果が未定義になります。
範囲が広い契約の関数を開発し、例外を発生させないことが分かっていれば、本項目に従い
noexcept と容易に宣言できます。範囲が狭い契約の関数では、状況はやや込み入って来ます。仮引
数に std::string をとる関数 f を開発するとしましょう。また、f 本来の実装では例外を発生させ
ることがないとします。この場合は、 ...