std::to_chars
来自 cppreference.com
在头文件 <charconv> 中定义 |
||
std::to_chars_result to_chars( char* first, char* last, |
(1) | (自 C++17 起) (自 C++23 起为 constexpr) |
std::to_chars_result to_chars( char*, char*, bool, int = 10 ) = delete; |
(2) | (自 C++17 起) |
std::to_chars_result to_chars( char* first, char* last, /* 浮点类型 */ value ); |
(3) | (自 C++17 起) |
std::to_chars_result to_chars( char* first, char* last, /* 浮点类型 */ value, |
(4) | (自 C++17 起) |
std::to_chars_result to_chars( char* first, char* last, /* 浮点类型 */ value, |
(5) | (自 C++17 起) |
将 value 转换为一个字符字符串,通过依次填充范围 [
first,
last)
,其中 [
first,
last)
必须是 有效范围。
1) 整数格式化程序:value 被转换为给定 base 中的数字字符串(不含冗余的前导零)。范围
10..35
(包含)中的数字用小写字母 a..z
表示。如果 value 小于零,则表示法以减号开头。库为所有 cv-未限定(自 C++23 起) 有符号和无符号整数类型以及 char 类型提供重载,作为参数 value 的类型。2) bool 的重载已删除。
std::to_chars
拒绝类型为 bool 的参数,因为结果将是 "0"/"1",而不是 "false"/"true",如果允许的话。3) value 被转换为字符串,如同在默认的 ("C") 本地化中使用 std::printf 一样。转换说明符为 f 或 e(在出现平局的情况下选择 f),根据最短表示的要求选择:字符串表示由最少数量的字符组成,这样在小数点之前(如果存在)至少有一个数字,并且使用相应的 std::from_chars 函数解析表示能够完全恢复 value。如果存在多个这样的表示,则选择与 value 差异最小的一个,使用根据 std::round_to_nearest 的舍入解决任何剩余的平局。库为所有 cv-未限定的 标准(直到 C++23) 浮点类型提供重载,作为参数 value 的类型。
4) 与 (3) 相同,但作为 if printf 指定的转换是 f,如果 fmt 是 std::chars_format::fixed,e,如果 fmt 是 std::chars_format::scientific,a(但结果中不包含前导 "0x"),如果 fmt 是 std::chars_format::hex,以及 g,如果 fmt 是 chars_format::general。库为所有 cv-未限定的 标准(直到 C++23) 浮点类型提供重载,作为参数 value 的类型。
5) 与 (4) 相同,除了精度由参数 precision 指定,而不是由最短表示要求指定。库为所有 cv-未限定的 标准(直到 C++23) 浮点类型提供重载,作为参数 value 的类型。
内容 |
[编辑] 参数
first, last | - | 要写入的字符范围 |
value | - | 要转换为其字符串表示的值 |
base | - | 要使用的整数基数:2 到 36 之间的值(包含)。 |
fmt | - | 要使用的浮点格式,类型为 std::chars_format 的位掩码 |
precision | - | 要使用的浮点精度 |
[编辑] 返回值
成功时,返回类型为 std::to_chars_result 的值,使得 ec
等于值初始化的 std::errc,而 ptr
是写入的字符的最后一个之后的指针。请注意,字符串没有以 NUL 结尾。
发生错误时,返回类型为 std::to_chars_result 的值,在 ec
中包含 std::errc::value_too_large,在 ptr
中包含值 last 的副本,并将范围 [
first,
last)
的内容置于未指定状态。
[编辑] 异常
不抛出任何异常。
[编辑] 备注
与 C++ 和 C 库中的其他格式化函数不同,std::to_chars
与区域设置无关,不进行分配,也不抛出异常。仅提供其他库(如 std::sprintf)使用的格式化策略的一小部分。这样做的目的是允许在常见的吞吐量高的上下文中(例如基于文本的交换(JSON 或 XML))使用尽可能快的实现。
仅当两个函数都来自同一实现时,才能保证 std::from_chars 可以完全恢复由 std::to_chars
格式化的每个浮点数的值。
如果要将 bool 值格式化为 "0"/"1",则需要显式地将它转换为另一个整数类型。
功能测试 宏 | 值 | 标准 | 特性 |
---|---|---|---|
__cpp_lib_to_chars |
201611L | (C++17) | 基本字符串转换(std::to_chars ,std::from_chars) |
202306L | (C++26) | 测试 <charconv> 函数的成功或失败 | |
__cpp_lib_constexpr_charconv |
202207L | (C++23) | 在 std::to_chars 和 std::from_chars 的重载 (1) 中为整数类型添加 constexpr 修饰符 |
[编辑] 示例
运行此代码
#include <charconv> #include <iomanip> #include <iostream> #include <string_view> #include <system_error> void show_to_chars(auto... format_args) { const size_t buf_size = 10; char buf[buf_size]{}; std::to_chars_result result = std::to_chars(buf, buf + buf_size, format_args...); if (result.ec != std::errc()) std::cout << std::make_error_code(result.ec).message() << '\n'; else { std::string_view str(buf, result.ptr - buf); std::cout << std::quoted(str) << '\n'; } } int main() { show_to_chars(42); show_to_chars(+3.14159F); show_to_chars(-3.14159, std::chars_format::fixed); show_to_chars(-3.14159, std::chars_format::scientific, 3); show_to_chars(3.1415926535, std::chars_format::fixed, 10); }
可能的输出
"42" "3.14159" "-3.14159" "-3.142e+00" Value too large for defined data type
[编辑] 缺陷报告
以下行为变更的缺陷报告已追溯应用于之前发布的 C++ 标准。
DR | 应用于 | 发布的行为 | 正确行为 |
---|---|---|---|
LWG 2955 | C++17 | 此函数在 <utility> 中,并使用 std::error_code | 移动到 <charconv> 并使用 std::errc |
LWG 3266 | C++17 | bool 参数被接受并提升为 int | 被已删除的重载拒绝 |
LWG 3373 | C++17 | std::to_chars_result 可能具有其他成员 |
不允许其他成员 |
[编辑] 另请参阅
(C++17) |
std::to_chars 的返回类型 (类) |
(C++17) |
将字符序列转换为整数或浮点数 (函数) |
(C++11) |
将整数或浮点数转换为 string (函数) |
(C++11) |
将格式化的输出打印到 stdout、文件流或缓冲区 (函数) |
插入格式化的数据 ( std::basic_ostream<CharT,Traits> 的公有成员函数) |