J'ai eu une belle conversation avec quelqu'un à propos de la chute de std::stoi
. Pour dire les choses crûment, il utilise std::strtol
en interne, et jette si qui signale une erreur. Selon eux, même si, std::strtol
ne devraient pas signaler une erreur pour une entrée de "abcxyz"
, provoquant stoi
ne pas jeter std::invalid_argument
.
Tout d'abord, voici deux programmes testés sur GCC sur les comportements de ces cas:
strtol
stoi
Tous les deux montrent le succès sur "123"
et échec sur "abc"
.
J'ai regardé dans le standard de tirer plus d'infos:
§ 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.
Qui résume le comportement de s'appuyer sur strtol
. Maintenant que diriez - strtol
? J'ai trouvé ça dans le C11 projet:
§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.
Compte tenu de la situation du passage dans "abc"
, la norme stipule que nptr
, qui pointe vers le début de la chaîne, serait stocké dans endptr
, le pointeur passé en. Cela semble cohérent avec le test. Aussi, 0 doit être retourné, comme l'a déclaré ceci:
§7.22.1.4
If no conversion could be performed, zero is returned.
La référence précédente, a déclaré qu'aucune conversion est effectuée, de sorte qu'il doit retourner 0. Ces conditions d'aujourd'hui se conformer avec le C++11 standard pour stoi
jetant std::invalid_argument
.
Le résultat de ce qui est important pour moi parce que je ne veux pas aller autour de recommander stoi
comme une meilleure alternative à d'autres méthodes de string en int la conversion, ou de l'utiliser moi-même comme si elle a travaillé la façon dont vous vous attendez, si il ne l'attrape pas le texte comme une défaillance de la conversion.
Donc, après tout, ne suis-je trompé quelque part? Il me semble que j'ai une bonne preuve de cette exception levée. Est ma preuve valide, ou est - std::stoi
n'est pas garanti que cette exception générée lorsqu'ils sont administrés "abc"
?