2016-01-11 21 views
6

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関数内での失敗は、入力エラーよりもはるかに "例外的"です。挿入を試みることなく、挿入が成功することを保証することは可能ですが、解析することなく、解析が成功することを保証することはできません。

私は、これらの機能が標準に受け入れられたときの根拠が何であるか不思議です。うまくいけば、それはどこかに公開されているか、または委員会のメンバーがこれを落として、このことを明らかにすることができます。例外のメリットとデメリットに関する包括的な論文を求めているわけではありません。

+0

明らかに、C++標準ライブラリの伝統をパース時に悪いと評価しています...例えば、手書きの再帰的降下パーサーでこれらの関数のいずれかを使用する場合は、 'strto' *それを呼び出す前に残りの入力のコピーを作成する必要があります。あるいは、ストリーム入力の貧弱な合成可能性を考慮する。まともな構文解析のために、2つの選択肢があります。あなた自身をロールバックするか、サードパーティのライブラリrspを使用します。パーサジェネレータ。 –

答えて

6

オリジナルペーパーN1803: Simple Numeric Accessは例外を使います。ただし、のデザインデザインの部分はどこから来ているのですか(なぜはアロケータを完全に無視しますか?)。それ以降の改訂版(N1982N2408)は、例外をスローする理由についても何も言いません。これらの論文を超えて、これに関する別の記録がある場合、私はそれを認識していません。

しかし、私は推測の危険があります。紙の最初の草案は例外をスローすることがわかります。そして、これがこれまでに論争していたとは思われません。これは、例外がC++、特にC++標準ライブラリの操作の失敗を示すための標準的な方法であるという見解から生じる可能性があります。

一部の標準ライブラリタイプには、他のエラーメカニズム(iostream)があります。しかし一般的に言えば、例外がデフォルトのケースです。

+0

私はペアを返す挿入関数*は既存の要素を同じキーで上書きしないと信じています。彼らはイテレータを返すだけなので、そうすることを選択すると上書きすることができます。だからある意味では、何も挿入されていないので、このような場合に関数は実際には失敗しました。これが標準ライブラリの外にあれば、私は "insert"という名前がひどく選ばれたと言うでしょう。しかし、スタンダードライブラリの "記述的"よりも "短い"ものが好きであることを考えると、私はなぜ彼らがちょうど "挿入"に固執したのか理解しています。 –

関連する問題