std::to_chars
定义于头文件 <charconv> |
||
std::to_chars_result to_chars( char* first, char* last, |
(1) | (since C++17) (constexpr since C++23) |
std::to_chars_result to_chars( char*, char*, bool, int = 10 ) = delete; |
(2) | (since C++17) |
std::to_chars_result to_chars( char* first, char* last, /* floating-point-type */ value ); |
(3) | (since C++17) |
std::to_chars_result to_chars( char* first, char* last, /* floating-point-type */ value, |
(4) | (since C++17) |
std::to_chars_result to_chars( char* first, char* last, /* floating-point-type */ value, |
(5) | (since C++17) |
通过连续填充范围 [
first,
last)
,将 value 转换为字符串,其中 [
first,
last)
必须是有效范围。
10..35
(包括)中的数字表示为小写字符 a..z
。如果值小于零,则表示形式以减号开头。该库为所有 cv-未限定的(自 C++23 起) 有符号和无符号整数类型以及类型 char 作为参数 value 的类型提供了重载。std::to_chars
拒绝 bool 类型的参数,因为如果允许,结果将是 "0"/"1" 而不是 "false"/"true"。目录 |
[编辑] 参数
first, last | - | 写入字符的范围 |
value | - | 要转换为字符串表示形式的值 |
base | - | 要使用的整数基数:介于 2 和 36 之间的值(包括 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" ,则需要显式地将 bool 值强制转换为另一种整数类型。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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> 的公共成员函数) |