2017-06-07 12 views
16

noexceptが導入され、throw()の多くの問題に対処したため、関数が例外をスローしないかどうかを指定する理由があります。コンパイル時の制限ではありませんが、コンパイラによる潜在的な最適化が可能になります。また、関数のユーザのためのシグナリングとドキュメントもありません。なぜnoexceptは標準ライブラリでそれ以上使用されていないのですか?

本の光で、私は私のような標準機能を介して閲覧するとき、実際には少し驚いた:std::timestd::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指定子の背後にある理由を知っているのですか、それともこの見落としではないかと思いますか?

+6

あなたはコミックに尋ねる必要があります。関数 'noexcept'を宣言すると、その関数を削除することは大きな変更になることに注意してください。下位互換性を維持しながら、いつでも後で追加することができます。 –

+7

最初の段落[here](https://stackoverflow.com/a/20517333/4342498)を参照してください。あなたが探しているものかもしれない – NathanOliver

+0

@ NathanOliverこれは実際に興味深い投稿です。しかし、未定義の動作を指定した関数だけでなく、 'noexcept'指定子が欠けているだけでなく、失敗することもできないこともできない関数もあります。少なくとも、私の短い調査からそのように見える。 –

答えて

1

、あなたは上記の書いたものを言い換え

はどのように noexceptものはポインタで渡されたときに保証することができますか?

カスタムクラス/関数を記述するときに例外をスローすることを保証することなくnoexceptにマークを付けることができます。しかし、あなたの関数がどんな場合でもスローされないことを絶対に確信していないときには、おそらくそれをしたくないでしょう。

関連する問題