我与某人就std::stoi
. 说白了就是在std::strtol
内部使用,如果报错就抛出。但是,根据他们的说法,std::strtol
不应为 的输入报告错误"abcxyz"
,从而导致stoi
不抛出std::invalid_argument
。
首先,这里有两个在 GCC 上测试过的关于这些情况的行为的程序:
strtol
stoi
他们都在 上显示成功"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.
之前的参考资料说不会执行任何转换,所以它必须返回 0。这些条件现在符合 C++11 标准的stoi
throwing std::invalid_argument
。
这个结果对我很重要,因为我不想到处推荐stoi
作为其他字符串到 int 转换方法的更好替代方法,或者自己使用它,就好像它按你期望的那样工作,如果它没有将文本捕获为无效转换。
那么在这一切之后,我是不是哪里出错了?在我看来,我有很好的证据证明这个异常被抛出。我的证明是否有效,或者std::stoi
不能保证在给出时抛出该异常"abc"
?