std :: stoul не выбрасывает std :: out_of_range - PullRequest
3 голосов
/ 18 июня 2019

Рассмотрим следующий код:

#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 в соответствии с документацией .Он никогда не должен достигать последней линии stoul.

На практике, это не бросает второе утверждение stoul.Я пробовал GCC 4.8.5 и MinGW 8.2.0, оба не смогли вызвать исключение out_of_range и только поставили invalid_argument в последнем утверждении stoul.

Это ошибка, о которой нужно сообщить, или я что-то упустил иэто ожидаемое поведение?

1 Ответ

8 голосов
/ 18 июня 2019

База по умолчанию для std::stoul равна 10.
stoul читает 0, x недопустимо, поэтому остальная часть строки игнорируется и возвращается числовое значение 0.

Используйте тот же синтаксис, что и в strtoul:

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

Или с автоматическим удержанием числовой базы:

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

Обе приведенные выше версии будут выбрасывать. Посмотри онлайн!

...