常见问题 - Boost C++ 函数库
-
问题: 为什么
lexical_cast<int8_t>("127")
会抛出 bad_lexical_cast
异常?-
回答: 类型
int8_t
是 char
或 signed char
的 typedef
。词法转换到这些类型仅仅是从源读取一个字节,但由于源包含多个字节,因此会抛出异常。请使用其他整数类型,如 int
或 short int
。如果边界检查很重要,您还可以调用 boost::numeric_cast
:numeric_cast<int8_t>(lexical_cast<int>("127"));
-
问题: 为什么
lexical_cast<unsigned char>("127")
会抛出 bad_lexical_cast
异常?-
回答: 词法转换到任何
char
类型仅仅是从源读取一个字节。但由于源包含多个字节,因此会抛出异常。请使用其他整数类型,如 int
或 short int
。如果边界检查很重要,您还可以调用 boost::numeric_cast
:numeric_cast<unsigned char>(lexical_cast<int>("127"));
-
问题:
lexical_cast<std::string>
对 int8_t
或 uint8_t
的转换为什么不符合我的预期?-
回答: 如上所述,请注意
int8_t
和 uint8_t
实际上是 char
,并且以 char
的方式进行格式化。要避免这种情况,请先转换为整数类型:lexical_cast<std::string>(static_cast<int>(n));
-
问题: 该实现总是重置底层流对象的
ios_base::skipws
标志。这破坏了我仅在存在此标志时才工作的 operator>>
。可以移除重置标志的代码吗?
-
问题: 为什么
std::cout << boost::lexical_cast<unsigned int>("-1");
不抛出异常,而是输出 4294967295?-
回答:
boost::lexical_cast
具有 std::stringstream
的行为,它使用 std::locale
的 num_get
函数来转换数字。如果我们查看 "Programming languages — C++",我们会看到 num_get
使用 scanf
的规则进行转换。根据 C99 标准,无符号输入值的减号是可选的,因此如果读取负数,不会出现错误,结果将是二进制补码。
-
问题: 为什么
boost::lexical_cast<int>(L'A');
输出 65,而 boost::lexical_cast<wchar_t>(L"65");
不抛出异常?-
回答: 如果您使用的是旧版本的 Visual Studio 或使用 /Zc:wchar_t- 标志编译代码,
boost::lexical_cast
会将单个 wchar_t
字符视为 unsigned short
。这不是 boost::lexical_cast
的错误,而是您使用的编译器选项的限制。
-
问题: 为什么
boost::lexical_cast<double>("-1.#IND");
会抛出 boost::bad_lexical_cast
?-
回答:
"-1.#IND"
是一个违反标准的编译器扩展。您应该输入 "-nan"
、"nan"
、"inf"
、"-inf"
(不区分大小写)字符串来获取 NaN 和 Inf 值。当 boost::lexical_cast<string>
具有 NaN 或 Inf 输入值时,它会输出 "-nan"
、"nan"
、"inf"
、"-inf"
字符串。
-
问题: 使用
boost::lexical_cast
转换非零终止字符串或子字符串的最快方法是什么?-
回答: 使用
boost::iterator_range
进行转换,或者使用带两个参数的 lexical_cast
重载。例如,如果您想将字符串 str
中的两个字符转换为 int
,您应该这样写:lexical_cast<int>(make_iterator_range(str.data(), str.data() + 2));
或 lexical_cast<int>(str.data(), 2);
。