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