首页 > 解决方案 > std::stoul 不抛出 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 异常。它永远不应该到达最后一条斯托尔线。

在实践中,它不会抛出第二个 stoul 语句。我已经尝试过 GCC 4.8.5 和 MinGW 8.2.0,两者都未能抛出 out_of_range 异常,并且只在最后一个 stoul 语句中传递了 invalid_argument。

这是应该报告的错误还是我遗漏了什么,这是预期的行为?

标签: c++exceptiong++g++4.8

解决方案


默认基数为std::stoul10。
stoul读取0,x无效,因此忽略字符串的其余部分并返回数值0

使用与中类似的语法strtoul

unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 16);

或自动扣除数字基数:

unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 0);

以上两个版本都会抛出。在线查看!


推荐阅读