Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Frequently Asked Questions
PrevUpHomeNext
  • 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: 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);.

PrevUpHomeNext