std::from_chars, std::from_chars_result
定义于头文件 <charconv>
|
||
std::from_chars_result from_chars(const char* first, const char* last, /*see below*/& value, int base = 10); |
(1) | (C++17 起) |
std::from_chars_result from_chars(const char* first, const char* last, float& value, std::chars_format fmt = std::chars_format::general); |
(2) | (C++17 起) |
std::from_chars_result from_chars(const char* first, const char* last, double& value, std::chars_format fmt = std::chars_format::general); |
(3) | (C++17 起) |
std::from_chars_result from_chars(const char* first, const char* last, long double& value, std::chars_format fmt = std::chars_format::general); |
(4) | (C++17 起) |
辅助类型 |
||
struct from_chars_result { const char* ptr; |
(5) | (C++17 起) |
按照后述模式分析字符序列 [first,last)
。若无字符匹配模式或若按照分析匹配字符获得的值不能以 value
的类型表示,则不修改 value
,否则将匹配模式的字符转译成算术值的文本表示,并将值存储于 value
。
- 对底 16 不识别 "0x" 或 "0X" 前缀
- 仅识别负号(不识别正号),而且只针对
value
的有符号整数类型。
char
提供重载,这些类型是参数 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" )。
std::from_chars_result
无基类或 ptr
、 ec
及隐式声明的特殊成员函数以外的成员。参数
first, last | - | 要分析的合法字符范围 |
value | - | 存储被分析值的输出参数,若分析成功 |
base | - | 使用的整数基底: 2 与 36 间的值(含上下限)。 |
fmt | - | 使用的浮点格式, std::chars_format 类型的位掩码 |
返回值
成功时,返回 from_chars_result
类型的值,其 ptr
指向首个不匹配模式的字符,或若所有字符皆匹配则指向拥有等于 last
的值,其 ec
被值初始化。
若无可匹配的模式,则返回 from_chars_result
类型的值,其 ptr
等于 first
且 ec
等于 std::errc::invalid_argument 。不修改 value
。
若模式匹配,但被分析值不在 value
的类型所表示的范围内,则返回 from_chars_result
类型的值,其 ec
等于 std::errc::result_out_of_range 且 ptr
指向首个不匹配模式的字符。不修改 value
。
operator==(std::from_chars_result)
friend bool operator==( const from_chars_result&, const from_chars_result& ) = default; |
(C++20 起) | |
检查两个参数的 ptr
与 ec
是否分别相等。
此函数对通常无限定或有限定查找不可见,而只能在 std::from_chars_result
为参数的关联类时由实参依赖查找找到。
!=
运算符从 operator==
合成。
异常
不抛出。
注解
不同于 C++ 和 C 库中的其他格式化函数, std::from_chars
是独立于本地环境、不分配、不抛出的。它只提供其他库(例如 std::sscanf )所用策略的一个小子集。它的目的是在常见的高吞吐量环境,例如基于文本的交换( JSON 或 XML )中,允许尽可能快的实现。
仅当两个函数都来自同一实现的情况下,才保证 std::from_chars 能恢复每个由 to_chars
格式化的浮点值。
由无后随数位的符号组成的模式被当做不匹配任何内容的模式。
示例
#include <iostream> #include <charconv> #include <array> int main() { std::array<char, 10> str{"42"}; int result; std::from_chars( str.data(), str.data()+str.size(),result ); std::cout << result; return 0; }
输出:
42
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2955 | C++17 | 此函数在 <utility> 并使用 std::error_code | 移动到 <charconv> 并使用 std::errc |
LWG 3373 | C++17 | from_chars_result 可能拥有额外的成员
|
禁止额外的成员 |
参阅
(C++17) |
转换整数或浮点值到字符序列 (函数) |
(C++11)(C++11)(C++11) |
转换字符串为有符号整数 (函数) |
(C++11)(C++11)(C++11) |
转换字符串为浮点值 (函数) |
(C++11) |
转换字节字符串为整数值 (函数) |
转换字节字符串为浮点值 (函数) | |
从 stdin、文件流或缓冲区读取有格式输入 (函数) | |
提取带格式数据 ( std::basic_istream<CharT,Traits> 的公开成员函数) |