请考虑以下代码:
#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异常(根据文档)。它不应该到达最后的stoul语句。
实际上,在第二个stoul语句上它并没有抛出异常。我尝试过GCC 4.8.5和MinGW 8.2.0,两者都未能抛出out_of_range异常,只在最后一个stoul语句上提供了invalid_argument。
这是一个应该报告的错误吗?还是我漏掉了什么,这是预期的行为?
stoul
推断基数,您需要使用std::stoul(..., nullptr, 0)
。 - Holterrno
清零(它只在失败时被写入,而不是成功 - 如果您想一次检查整个操作块,这可能很有用)。 - Toby Speight