Lexical_cast выдает исключение - PullRequest
0 голосов
/ 01 июля 2019

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

Что может быть не так с 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;
    }
}

1 Ответ

1 голос
/ 01 июля 2019

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

Boost Lexical Cast

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

#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 * ​​1014 *

Итак, я чувствую, что каждый персонаж воспринимается как 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.

Надеюсь, это поможет!

...