c++ - std::stoul 不抛出 std::out_of_range

标签 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 线。

实际上,它不会抛出第二个 stoul 语句。我试过 GCC 4.8.5 和 MinGW 8.2.0,都没有抛出 out_of_range 异常,并且只在最后一个 stoul 语句中传递了 invalid_argument。

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

最佳答案

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!

关于c++ - std::stoul 不抛出 std::out_of_range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56649437/

相关文章:

java - 我应该在模型中使用 HttpStatus 抛出异常吗?

linux - 为什么我没有从 g++ 中收到 "Multiple definition"错误?

python - Dlib 库 - 如何在 Python 上更改相关跟踪器的参数

c++ - boost::asio 如何以正确的方式读取完整缓冲区?

python - 在 Python 中引发 IOError 异常的最佳实践

c++ - 返回带有持久缓冲区的字符串

c++ - 在 Windows 7 上链接 .lib 文件

c++ - 为什么 WindowStateChange 事件对我不起作用

c++ - 何时删除缓冲区对象?

android - IllegalArgumentException : Invalid int: "OS" with Samsung tts