to_string仅支持基本数值类型(如int、double等),不支持指针、自定义类或char;传char得ASCII码,bool转0/1,不处理进制与精度,无异常且locale无关。

to_string 函数能转哪些类型?
to_string 是 C++11 起标准库提供的转换函数,只支持整型、浮点型等基本数值类型,不支持指针、自定义类或 char。常见可用参数包括:int、long、long long、unsigned 系列、float、double、long double。
它不会处理进制(比如十六进制)、精度控制或前导零——这些得靠 std::ostringstream 或 std::format(C++20)。
- 传入
char会转成对应 ASCII 数字(比如to_string('A')得到"65",不是"A") - 传入
bool会先隐式转为int(true→1,false→0) - 传入
nullptr或裸指针直接编译失败
to_string(int) 的典型用法和坑
最常用的就是把 int 变成 std::string,看起来简单,但容易忽略两点:异常安全性和 locale 无关性。
to_string 内部不抛异常,也不受当前 locale 影响(比如不会按德语习惯用逗号当小数点),这点比 std::stringstream 更可控。但它也不支持任何格式化。
立即学习“C++免费学习笔记(深入)”;
- 不要指望
to_string(42)返回"042"或"0x2a" - 负数正常处理,
to_string(-7)得到"-7",无额外空格 - 在嵌入式或极简环境(如某些 freestanding 实现)中,
to_string可能未实现,需查证标准库支持情况
替代方案什么时候更合适?
当你需要格式控制时,to_string 就不够用了。比如补零、指定进制、保留小数位数,就得换方法。
std::ostringstream 兼容性最好(C++98 起),适合老项目;std::format(C++20)语法简洁且高效,但目前 MSVC/GCC/Clang 对它的支持仍不完全一致。
- 补零两位:
std::ostringstream{} → <code>"05" - 十六进制:
std::ostringstream{} → <code>"ff" - C++20:
std::format("{:02d}", 5)或std::format("{:#x}", 255) - 注意:
std::to_string没有重载接受std::ios_base::fmtflags,别试图塞std::hex进去
性能差异大不大?
纯转 int 到字符串,to_string 通常比 std::ostringstream 快 2–3 倍,因为它绕过了流状态管理和 locale 查询。但差距在纳秒级,除非你在 tight loop 里每秒调用百万次,否则不用为此纠结。
真正影响性能的是字符串分配——所有方案都返回新 std::string,如果频繁调用且字符串很短,可考虑复用缓冲区或用 std::to_chars(C++17,返回 char*,无内存分配)。
-
std::to_chars是唯一不分配堆内存的选项,但要用起来麻烦些:得自己预估缓冲区大小(比如char buf[12]足够存 32 位 int) -
to_string在 debug 模式下可能因调试检查变慢,release 下才体现优势 - 跨平台时,
to_string行为完全一致;而snprintf类方案要注意%lld等格式符的可移植性











