std:: from_chars
|
定义于头文件
<charconv>
|
||
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(1) |
(C++17 起)
(C++23 起为 constexpr) |
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(2) | (C++17 起) |
分析字符序列
[
first
,
last
)
是否符合下述模式。若没有字符匹配该模式,或解析匹配字符获得的值无法在
value
的类型中表示,则
value
保持不变;否则将匹配模式的字符解释为算术值的文本表示形式,并将其存储到
value
中。
- 当 base 为 16 时,不识别 "0x" 或 "0X" 前缀
- 仅识别负号(不识别正号),且仅适用于 value 的有符号整数类型
- 不忽略前导空白符
- 加号在指数部分外不被识别(仅允许在开头使用减号)
-
若
fmt设置了 std::chars_format::scientific 但未设置 std::chars_format::fixed ,则指数部分必须存在(否则为可选) -
若
fmt设置了 std::chars_format::fixed 但未设置 std::chars_format::scientific ,则不允许存在可选的指数部分 -
若
fmt为 std::chars_format::hex ,则不允许前缀 "0x" 或 "0X" (字符串 "0x123" 将被解析为数值 "0" ,未解析部分为 "x123" ) - 不忽略前导空白符
目录 |
参数
| first, last | - | 要解析的有效字符范围 |
| value | - | 输出参数,解析成功时存储解析后的值 |
| base | - | 使用的整数基数:取值范围为2到36(含边界值) |
| fmt | - | 使用的浮点数格式,为 std::chars_format 类型的位掩码 |
返回值
成功时,返回类型为
std::from_chars_result
的值,其中
ptr
指向第一个不匹配模式的字符,若所有字符都匹配则其值等于
last
,且
ec
为值初始化状态。
如果没有模式匹配,返回一个类型为
std::from_chars_result
的值,其中
ptr
等于
first
且
ec
等于
std::errc::invalid_argument
。
value
保持不变。
如果模式匹配成功,但解析值超出
value
类型可表示的范围,则返回
std::from_chars_result
类型的值,其中
ec
等于
std::errc::result_out_of_range
且
ptr
指向第一个不匹配模式的字符。
value
保持未修改状态。
异常
不抛出任何异常。
注释
与C++和C库中的其他解析函数不同,
std::from_chars
具有区域设置无关性、无需内存分配且不会抛出异常。该函数仅提供其他库(如
std::sscanf
)所采用解析策略的一个小子集。这样的设计旨在实现可能达到的最快执行速度,适用于常见的高吞吐量场景,例如基于文本的数据交换(
JSON
或
XML
)。
保证
std::from_chars
能够精确恢复由
std::to_chars
格式化的每个浮点数值,这一承诺仅在两个函数来自同一实现时提供。
由符号组成且其后无数字的模式将被视为未匹配任何内容的模式。
| 功能测试 宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_to_chars
|
201611L
|
(C++17) |
基础字符串转换(
std::from_chars
,
std::to_chars
)
|
202306L
|
(C++26) | 测试 <charconv> 函数的成功与失败状态 | |
__cpp_lib_constexpr_charconv
|
202207L
|
(C++23) |
为整型类型的
std::from_chars
和
std::to_chars
重载添加
constexpr
修饰符
|
示例
#include <cassert> #include <charconv> #include <iomanip> #include <iostream> #include <optional> #include <string_view> #include <system_error> int main() { for (std::string_view const str : {"1234", "15 foo", "bar", " 42", "5000000000"}) { std::cout << "String: " << std::quoted(str) << ". "; int result{}; auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), result); if (ec == std::errc()) std::cout << "Result: " << result << ", ptr -> " << std::quoted(ptr) << '\n'; else if (ec == std::errc::invalid_argument) std::cout << "This is not a number.\n"; else if (ec == std::errc::result_out_of_range) std::cout << "This number is larger than an int.\n"; } // C++23 的 constexpr from_char 演示 / C++26 的 operator bool() 演示: auto to_int = [](std::string_view s) -> std::optional<int> { int value{}; #if __cpp_lib_to_chars >= 202306L if (std::from_chars(s.data(), s.data() + s.size(), value)) #else if (std::from_chars(s.data(), s.data() + s.size(), value).ec == std::errc{}) #endif return value; else return std::nullopt; }; assert(to_int("42") == 42); assert(to_int("foo") == std::nullopt); #if __cpp_lib_constexpr_charconv and __cpp_lib_optional >= 202106 static_assert(to_int("42") == 42); static_assert(to_int("foo") == std::nullopt); #endif }
输出:
String: "1234". Result: 1234, ptr -> "" String: "15 foo". Result: 15, ptr -> " foo" String: "bar". This is not a number. String: " 42". This is not a number. String: "5000000000". This number is larger than an int.
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 2955 | C++17 | 该函数原位于 <utility> 且使用 std::error_code | 已移至 <charconv> 并使用 std::errc |
| LWG 3373 | C++17 |
std::from_chars_result
可能包含额外成员
|
禁止包含额外成员 |
参见
|
(C++17)
|
std::from_chars
的返回类型
(类) |
|
(C++17)
|
将整数或浮点数值转换为字符序列
(函数) |
|
(C++11)
(C++11)
(C++11)
|
将字符串转换为有符号整数
(函数) |
|
(C++11)
(C++11)
(C++11)
|
将字符串转换为浮点数值
(函数) |
|
(C++11)
|
将字节字符串转换为整数值
(函数) |
|
将字节字符串转换为浮点数值
(函数) |
|
|
从
stdin
、文件流或缓冲区读取格式化输入
(函数) |
|
|
提取格式化数据
(
std::basic_istream<CharT,Traits>
的公开成员函数)
|