通常は絶対に失敗しない関数があるとします。たとえば、次のようになります。
std::string convert_integer_to_string(int x);
原則として、これは の候補になりnoexcept
ます。ただし、実装には動的メモリ管理が含まれる可能性が最も高いため、演算子でメモリを割り当てるときに常にstd::bad_allocnew
をスローする可能性があります。
関数に noexcept のアノテーションを付けることをお勧めしますか?
実際的な観点からは、メモリ不足の状況を合理的な方法で処理することは非常に困難です。ほとんどのプログラムは、十分なメモリが利用可能であると想定しています。関数が をスローstd::terminate
した場合に発生するように、 を呼び出すことは、その場合は合理的であるように思われます。noexcept
std::bad_alloc
私にとってnoexcept
は、ある種のドキュメントです。ユーザー (またはオプティマイザー) が、この関数が決してスローしないと安全に想定できるという約束です。メモリ不足の状況を気にしないアプリケーションをプログラミングしている場合でも、それは有効な仮定です。
最も安全な推奨事項は、例外がスローされる可能性があるnoexcept
場合は使用しないことだと思います。std::bad_alloc
一方で、noexcept
メモリ不足の状況を気にしない (つまり、std::terminate
OK の場合) と仮定すると、とにかく使用する利点があるかどうか疑問に思います。