Lexical_cast выдает исключение

boost :: lexical_cast выдает исключение при преобразовании строки в int8_t, но int32_t - norm.

Что может быть не так с int8_t?

#include <iostream>
#include <cstdlib>
#include <boost/lexical_cast.hpp>

int main()
{
    try
    {
        const auto a = boost::lexical_cast<int8_t>("22");
        std::cout << a << std::endl;
    }
    catch( std::exception &e )
    {
        std::cout << "e=" << e.what() << std::endl;
    }
}

person Vadim Ostanin    schedule 01.07.2019    source источник
comment
Вопрос: Почему lexical_cast<unsigned char>("127") бросает bad_lexical_cast? Ответ. Лексическое преобразование в любой тип char - это просто чтение байта из источника. Но поскольку у источника более одного байта, возникает исключение. Используйте другие целочисленные типы, например int или short int. Если проверка границ важна, вы также можете вызвать boost::numeric_cast: numeric_cast<unsigned char>(lexical_cast<int>("127")); из boost ссылка. В вашем случае int8_t - это псевдоним для char.   -  person rafix07    schedule 01.07.2019


Ответы (1)


Для boost::lexical_cast предполагается, что символьный тип базового потока - char, если только источник или цель не требуют потоковой передачи широких символов, и в этом случае базовый поток использует wchar_t. Следующие типы также могут использовать char16_t или char32_t для потоковой передачи широких символов.

Итак, после внесения следующих изменений в ваш код:

#include <iostream>
#include <cstdlib>
#include <boost/lexical_cast.hpp>

int main() 
{
   try
   {
       const auto a = boost::lexical_cast<int8_t>("2");
       const auto b = boost::lexical_cast<int16_t>("22");
       std::cout << a << " and "<< b << std::endl;
   }
   catch( std::exception &e )
   {
      std::cout << "e=" << e.what() << std::endl;
   }
 return 0;
}

Дает результат ниже

2 и 22

Итак, я чувствую, что каждый символ воспринимается как char.

Итак, для const auto a = boost::lexical_cast<int16_t>("2"); 2 принимается как одиночный char, для которого требуется int8_t.

И для const auto b = boost::lexical_cast<int16_t>("22"); 22 принимается как два значения char, для которых требуется int16_t.

Я надеюсь, что это помогает!

person Abhishek Sinha    schedule 01.07.2019