-
Question: Why does
lexical_cast<int8_t>("127") throw bad_lexical_cast?
-
Answer: The type
int8_t
is a typedef to char or signed
char. Lexical conversion to
these types is simply reading a byte from source but since the source
has more than one byte, the exception is thrown. Please use other
integer types such as int
or short int.
If bounds checking is important, you can also call boost::numeric_cast: numeric_cast<int8_t>(lexical_cast<int>("127"));
-
Question: Why does
lexical_cast<unsigned char>("127")
throw bad_lexical_cast?
-
Answer: Lexical conversion to any
char type is simply reading a byte from source. But since the source
has more than one byte, the exception is thrown. Please use other
integer types such as
int
or short int.
If bounds checking is important, you can also call boost::numeric_cast: numeric_cast<unsigned char>(lexical_cast<int>("127"));
-
Question: What does
lexical_cast<std::string> of an int8_t
or uint8_t not do what
I expect?
-
Answer: As above, note that int8_t
and uint8_t are actually chars and are formatted as such. To avoid
this, cast to an integer type first:
lexical_cast<std::string>(static_cast<int>(n));
-
Question: The implementation always resets
the
ios_base::skipws flag of an underlying stream object.
It breaks my operator>>
that works only in presence of this flag. Can you remove code that resets
the flag?
-
Question: Why
std::cout << boost::lexical_cast<unsigned int>("-1");
does not throw, but outputs 4294967295?
-
Answer:
boost::lexical_cast
has the behavior of std::stringstream,
which uses num_get
functions of std::locale
to convert numbers. If we look at the Programming languages — C++,
we'll see, that num_get
uses the rules of scanf
for conversions. And in the C99 standard for unsigned input value
minus sign is optional, so if a negative number is read, no errors
will arise and the result will be the two's complement.
-
Question: Why
boost::lexical_cast<int>(L'A'); outputs
65 and boost::lexical_cast<wchar_t>(L"65"); does not throw?
-
Answer: If you are using an old
version of Visual Studio or compile code with /Zc:wchar_t- flag,
boost::lexical_cast sees single wchar_t character as unsigned short.
It is not a boost::lexical_cast
mistake, but a limitation of compiler options that you use.