Frequently Asked Questions

| Home | Libraries | People | FAQ | More

## Frequently Asked Questions

- 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?
  - Answer: May be in a future version. There is no requirement in Lexical Conversion Library Proposal for TR2, N1973 by Kevlin Henney and Beman Dawes to reset the flag but remember that Lexical Conversion Library Proposal for TR2, N1973 is not yet accepted by the committee. By the way, it's a great opportunity to make your `operator>>` more general. Read a good C++ book, study `std::sentry` and `ios_state_saver`.

- 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);`.