2

少し奇妙に思えるかもしれませんが、初期化リストでその日を節約する例外をスローする三項を使用することがよくあります(したがって、サウンドコンストラクターの作成に役立ち、RAIIに役立ちます...)。たとえば、引数asmart_ptr<>非必要な場合nullptr、次のようなメンバーを開始できます

member(a ? a->get_something() : throw exception())

これは有効で、合法で安全な使用法だと思います (そうでない場合は教えてください)。

最近、boost::exception に切り替えましたが、残念ながらcondition ? ret_value : BOOST_THROW_EXCEPTION(exception())コンパイルされません (コンパイラは and を具体化できないためtypeof(ret_value)) void

まったく新しいプライベート静的メソッドを作成してif内部に配置するよりも優れた回避策はありますか?

4

2 に答える 2

0

これは有効で合法的で安全な使用法だと思います (そうでない場合は教えてください)。

そうじゃないんだよ。あなたが得ることができるくだらない議論に対して防御することはできませんし、すべきではありません。もしそうなら、あなたはすべてをチェックしなければならないからです. 関数size_tの引数に適切な値が含まれているかどうかをチェックする必要があります。char*NULL かどうかを確認する必要があり、そうでない場合はゼロ区切りかどうかを確認する必要があります。クラスと関数全体に何千ものチェックを適用して、発生する可能性は低いが奇妙な状況で発生する可能性があることを確認する必要があります。

std::strlenおよびを考慮してくださいstd::string::string(char const*)。どちらも、引数が null で終了する char 文字列への null 以外のポインターであることを要求します。チェックは適用されません。NULL を渡すと、UB が返されます。

関数が null 以外のポインターを返すことを保証する多くの場合があります。そのような結果がコンストラクター (またはstrlen、さらに言えば ) に渡される場合、余分なチェックは時間とプログラミングの労力の無駄です。
つまり、null ポインターをテストしないでください。代わりに、null 以外のポインターを要求するだけです。正しい引数を渡すのはクライアントの責任です。これは、null ポインターをチェックする必要があるかどうかをクライアント コードだけが知っており、呼び出しの前にチェックするか、例外をキャッチすることによって、null ポインターのケースを処理する必要があるためです。

于 2013-05-14T08:04:39.613 に答える