の没落について誰かと素敵な会話をしましたstd::stoi
。率直に言えば、内部的に使用しstd::strtol
、エラーが報告された場合にスローします。彼らによると、ただし、std::strtol
の入力に対してエラーを報告すべきではなく、がスロー"abcxyz"
されません。stoi
std::invalid_argument
まず、これらのケースの動作について GCC でテストされた 2 つのプログラムを次に示し
ます
。
どちらも で成功、"123"
で失敗を示し"abc"
ます。
私はより多くの情報を引き出すために標準を調べました:
§ 21.5
Throws: invalid_argument if strtol, strtoul, strtoll, or strtoull reports that
no conversion could be performed. Throws out_of_range if the converted value is
outside the range of representable values for the return type.
これは、に依存する動作を要約したものstrtol
です。今はどうstrtol
ですか?C11ドラフトでこれを見つけました:
§7.22.1.4
If the subject sequence is empty or does not have the expected form, no
conversion is performed; the value of nptr is stored in the object
pointed to by endptr, provided that endptr is not a null pointer.
を渡す状況を考えると"abc"
、C 標準nptr
では、文字列の先頭を指す は、渡されたポインタである に格納されると規定されendptr
ています。これは、テストと一致しているようです。また、次のように 0 を返す必要があります。
§7.22.1.4
If no conversion could be performed, zero is returned.
stoi
以前のリファレンスでは、変換が実行されないため、0 を返さなければならないと言われていました。これらの条件は、 throwingの C++11 標準に準拠するようになりましたstd::invalid_argument
。
この結果は私にとって重要です。stoi
文字列から int への変換の他の方法のより良い代替手段として推奨したり、期待どおりに機能したかのように自分で使用したりしたくないからです。テキストを無効な変換としてキャッチします。
このすべての後、私はどこかで間違っていましたか?この例外がスローされたという良い証拠があるように思えます。私の証明は有効ですか、またはstd::stoi
与えられたときにその例外をスローすることが保証されていません"abc"
か?