Ist std :: stoi tatsächlich sicher zu bedienen?

Ich hatte ein nettes Gespräch mit jemandem über den Untergang vonstd::stoi. Um es klar zu sagen, es nutztstd::strtol intern, und wirft, wenn das einen Fehler meldet. Ihnen zufolge jedochstd::strtol sollte keinen Fehler für eine Eingabe von melden"abcxyz"verursachenstoi nicht zu werfenstd::invalid_argument.

Zuallererst sind hier zwei auf GCC getestete Programme zu den Verhaltensweisen dieser Fälle:
strtol
stoi

Beide zeigen Erfolg auf"123" und scheitern an"abc".

Ich habe in der Norm nachgesehen, um weitere Informationen zu erhalten:

§ 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.

Das fasst das Verhalten des Vertrauens zusammenstrtol. Und jetzt?strtol? Das habe ich im C11-Entwurf gefunden:

§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.

Angesichts der Situation des Vorbeigehens"abc"schreibt der C-Standard dies vornptr, der auf den Anfang der Zeichenkette zeigt, würde in gespeichertendptr, übergab der Zeiger. Dies scheint mit dem Test übereinzustimmen. Außerdem sollte 0 wie folgt zurückgegeben werden:

§7.22.1.4

If no conversion could be performed, zero is returned.

In der vorherigen Referenz wurde angegeben, dass keine Konvertierung durchgeführt werden würde, sodass 0 zurückgegeben werden muss. Diese Bedingungen entsprechen nun dem C ++ 11-Standard fürstoi werfenstd::invalid_argument.

Das Ergebnis ist mir wichtig, weil ich nicht empfehlen möchtestoi Dies ist eine bessere Alternative zu anderen Methoden zur Konvertierung von Zeichenfolgen in int. Oder Sie verwenden es selbst, als würde es wie erwartet funktionieren, wenn Text nicht als ungültige Konvertierung abgefangen wird.

Also, nach all dem bin ich irgendwo falsch gelaufen? Mir scheint, ich habe gute Beweise dafür, dass diese Ausnahme geworfen wird. Ist mein Beweis gültig oder iststd::stoi Es kann nicht garantiert werden, dass diese Ausnahme ausgelöst wird, wenn sie gegeben ist"abc"?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage