std::stoul 不扔 std::out_of_range
std::stoul not throwing std::out_of_range
考虑以下代码:
#include <iostream>
#include <cstring>
#include <cerrno>
int main() {
unsigned long num = strtoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", NULL, 16);
std::cout << std::strerror(errno) << "\n";
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF");
std::stoul("hello world");
return 0;
}
此代码预计会从 strerror 打印一些 "Out of range",然后抛出 out_of_range 异常 according to documentation。它永远不会到达最后的 stoul 线。
实际上,它不会抛出第二个 stoul 语句。我试过 GCC 4.8.5 和 MinGW 8.2.0,都没有抛出 out_of_range 异常,并且只在最后一个 stoul 语句中传递 invalid_argument。
这是一个应该报告的错误,还是我遗漏了什么,这是预期的行为?
std::stoul
的默认基数是 10。
stoul
读取 0
,x
无效,因此忽略字符串的其余部分并返回数值 0
。
使用与 strtoul
类似的语法:
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 16);
或自动扣除基数:
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 0);
以上两个版本都会抛出。 See it online!
考虑以下代码:
#include <iostream>
#include <cstring>
#include <cerrno>
int main() {
unsigned long num = strtoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", NULL, 16);
std::cout << std::strerror(errno) << "\n";
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF");
std::stoul("hello world");
return 0;
}
此代码预计会从 strerror 打印一些 "Out of range",然后抛出 out_of_range 异常 according to documentation。它永远不会到达最后的 stoul 线。
实际上,它不会抛出第二个 stoul 语句。我试过 GCC 4.8.5 和 MinGW 8.2.0,都没有抛出 out_of_range 异常,并且只在最后一个 stoul 语句中传递 invalid_argument。
这是一个应该报告的错误,还是我遗漏了什么,这是预期的行为?
std::stoul
的默认基数是 10。
stoul
读取 0
,x
无效,因此忽略字符串的其余部分并返回数值 0
。
使用与 strtoul
类似的语法:
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 16);
或自动扣除基数:
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 0);
以上两个版本都会抛出。 See it online!