std :: stoul不会抛出std :: out_of_range

时间:2019-06-18 12:41:44

标签: c++ exception g++ g++4.8

考虑以下代码:

#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异常according to documentation。它永远不会到达最后的污迹线。

实际上,它不会引发第二个stoul语句。我已经尝试了GCC 4.8.5和MinGW 8.2.0,但都没有抛出out_of_range异常,只在最后一个stoul语句上传递了invalid_argument。

这是应该报告的错误,还是我缺少某些东西,这是预期的行为?

1 个答案:

答案 0 :(得分:8)

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

使用与strtoul中类似的语法:

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

或自动扣除数字基数:

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

以上两个版本都将抛出。 See it online!