-
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.
-
Question: Why
boost::lexical_cast<double>("-1.#IND");
throws boost::bad_lexical_cast
?
-
Answer:
"-1.#IND"
is a compiler extension, that violates standard. You shall input
"-nan"
, "nan"
, "inf"
, "-inf"
(case
insensitive) strings to get NaN and Inf values. boost::lexical_cast<string>
outputs "-nan"
,
"nan"
, "inf"
, "-inf"
strings, when has NaN or Inf input values.
-
Question: What is the fastest way to convert
a non zero terminated string or a substring using
boost::lexical_cast
?
-
Answer: Use
boost::iterator_range
for conversion or lexical_cast
overload with two parameters. For example, if you whant to convert
to int
two characters
from a string str
,
you shall write lexical_cast<int>(make_iterator_range(str.data(), str.data() + 2));
or lexical_cast<int>(str.data(),
2);
.