std :: stof、std :: stod、std :: stoldが例外をスローする理由は何ですか?なぜstd :: stof、std :: stod、およびstd :: stoldは例外を伴うエラーを処理するのですか?
http://en.cppreference.com/w/cpp/string/basic_string/stof
入力エラーの例外を経由して、エラー処理は(通常は「例外的な状況」が、それでも良い例の風変わりな循環論法を言葉で表現)が悪い適合しているときのために一般的に使用される例です。まるで他のエラー処理メカニズムがC++標準ライブラリで何らかの形で起きているかのようではありません。たとえば、別のC++ 11の新入社であるstd::unordered_map::insert
ファミリは、std::pair<iterator,bool>
戻り値の型の2番目の要素を使用して失敗したことを示します。 std::unordered_map::insert
関数内での失敗は、入力エラーよりもはるかに "例外的"です。挿入を試みることなく、挿入が成功することを保証することは可能ですが、解析することなく、解析が成功することを保証することはできません。
私は、これらの機能が標準に受け入れられたときの根拠が何であるか不思議です。うまくいけば、それはどこかに公開されているか、または委員会のメンバーがこれを落として、このことを明らかにすることができます。例外のメリットとデメリットに関する包括的な論文を求めているわけではありません。
明らかに、C++標準ライブラリの伝統をパース時に悪いと評価しています...例えば、手書きの再帰的降下パーサーでこれらの関数のいずれかを使用する場合は、 'strto' *それを呼び出す前に残りの入力のコピーを作成する必要があります。あるいは、ストリーム入力の貧弱な合成可能性を考慮する。まともな構文解析のために、2つの選択肢があります。あなた自身をロールバックするか、サードパーティのライブラリrspを使用します。パーサジェネレータ。 –