应避免使用 lexical_cast,因其属已弃用的 boost 组件,而应优先选用 c++11 的 std::stoi/stod 等标准函数或 c++17 的无异常 std::from_chars。

别用 lexical_cast ——它不是标准库组件,也不是“必备”,而是 Boost 库里一个已过时、有隐患的老工具。
为什么 lexical_cast 不该出现在新代码里
它来自 Boost,但自 C++11 起,标准库提供了更安全、更明确的替代方案;lexical_cast 在转换失败时不抛具体异常(比如 bad_lexical_cast 本质是 std::bad_cast 的子类),且对空字符串、前后空格、溢出等边界处理模糊;C++17 后连 Boost 本身也标记它为“deprecated”。
- 转换
"123"→int看似没问题,但" 123 "(带空格)会直接抛异常,而std::stoi默认跳过前导空格 -
lexical_cast<int>("99999999999999999999")</int>可能静默截断或抛异常,不区分溢出类型 - 编译依赖 Boost,增加构建链负担,且不同 Boost 版本行为略有差异
std::stoi / std::stod 等 C++11 标准转换函数怎么用
它们是当前最常用、最可控的字符串转数值方案,每个函数职责单一,错误语义清晰。
- 用
std::stoi转整数,std::stod转 double,std::stoul转无符号长整,依此类推 - 第二个参数可传
size_t*指针,用于获取成功解析的字符数,从而判断是否“全串匹配”:auto n = std::stoi(s, &idx); if (idx != s.size()) { /* 有多余字符 */ } - 溢出时抛
std::out_of_range,格式错误抛std::invalid_argument,异常类型明确,便于针对性捕获 - 不接受 locale,所以不支持千位分隔符(如
"1,234"),这是优点——避免隐式本地化歧义
需要类型安全 + 编译期检查?用 std::from_chars(C++17)
它是目前性能最高、最轻量的解析接口,不抛异常、不分配内存、不依赖 locale,适合高频或嵌入式场景。
立即学习“C++免费学习笔记(深入)”;
- 返回
std::from_chars_result结构体,含ptr(解析结束位置)和ec(std::errc错误码) - 示例:
int x; auto res = std::from_chars(s.data(), s.data() + s.size(), x); if (res.ec == std::errc{}) { /* 成功 */ } - 不支持浮点数四舍五入控制,也不解析科学计数法以外的格式(如
"inf"或"nan") - 注意:MSVC 2019 16.10+、GCC 11+、Clang 12+ 才完整支持;老版本可能缺失
float/double重载
真正容易被忽略的是:没有万能转换函数。要不要跳空格、允不允许尾随字符、溢出时是报错还是截断、是否要 locale 支持——这些必须由你显式决定,而不是靠某个“自动猜”的黑盒函数。选 std::stoi 还是 std::from_chars,取决于你是否需要异常、是否在意分配、以及目标标准版本。









