noexcept
が導入され、throw()
の多くの問題に対処したため、関数が例外をスローしないかどうかを指定する理由があります。コンパイル時の制限ではありませんが、コンパイラによる潜在的な最適化が可能になります。また、関数のユーザのためのシグナリングとドキュメントもありません。なぜnoexceptは標準ライブラリでそれ以上使用されていないのですか?
本の光で、私は私のような標準機能を介して閲覧するとき、実際には少し驚いた:std::time
、std::timespec_get
、及びstd::memcmp
、及びそれらのいずれもnoexcept
指定子を使用しないことを見ました。標準ライブラリでは、それを使用する関数がまったくないようにはありません。例えば、std::tie
関数がそれを使用するなどです。しかし、機能の大部分は、それを使用しないでください。
std::strlen
のような特定の状況で未定義の動作を持つ関数にとっては意味があると思います。実装者の自由度が増すからです。
しかし、未定義の動作につながる可能性があり、例外を発生させない明示的な状況がない関数の場合、noexcept
指定子を使用してこれらの関数を宣言しないのはなぜですか?
たとえば、std::timespec_get
はC++ 11の新機能であるため、古いC関数との類似性を保つためだけではありません。
コンパイラは、関数が例外をスローしないように、そして同じ最適化を実行できることを検出するのに十分なほどスマートになるかもしれません。しかし、私の意見では、noexcept
の最良の引数の1つはドキュメントの価値であり、それが欠落している場合は不足しています。
これは、missing std::make_unique
の場合と同じように、標準ライブラリの指定されていないnoexcept
指定子が本当に見落としであるという私の最後の仮説につながります。しかし、C++ 14で訂正された(実装された)不足しているstd::make_unique
とは異なり、上記の関数はまだ(C++ 17のように)noexcept
になっていません。
誰かが不足しているnoexcept
指定子の背後にある理由を知っているのですか、それともこの見落としではないかと思いますか?
あなたはコミックに尋ねる必要があります。関数 'noexcept'を宣言すると、その関数を削除することは大きな変更になることに注意してください。下位互換性を維持しながら、いつでも後で追加することができます。 –
最初の段落[here](https://stackoverflow.com/a/20517333/4342498)を参照してください。あなたが探しているものかもしれない – NathanOliver
@ NathanOliverこれは実際に興味深い投稿です。しかし、未定義の動作を指定した関数だけでなく、 'noexcept'指定子が欠けているだけでなく、失敗することもできないこともできない関数もあります。少なくとも、私の短い調査からそのように見える。 –