std::to_string 是 C++11 起标准库提供的最直接、安全的 int 转 std::string 方法,无需手动管理内存或格式化缓冲区,仅支持内置数值类型的十进制转换,不支持自定义进制、前导零或宽度控制,且要求包含 头文件并使用 std:: 命名空间。

std::to_string 是 C++11 起标准库提供的最直接、安全的 int 转 std::string 方法,无需手动管理内存或格式化缓冲区。
to_string 函数的基本用法和参数限制
std::to_string 接收一个算术类型(int、long、double 等)并返回对应十进制表示的 std::string。它不支持自定义进制、前导零或宽度控制。
- 只接受内置数值类型,不能传
std::string或指针 - 对
int类型,结果不含前导空格或符号前空格(负数会带-) - 不抛异常,但传入非数值类型(如
nullptr)会导致编译失败
示例:
int x = -42; std::string s = std::to_string(x); // s == "-42"
为什么不用 sprintf / itoa / stringstream?
这些方法在特定场景下仍存在,但各有明显短板:
立即学习“C++免费学习笔记(深入)”;
-
sprintf需要预分配字符数组,容易溢出;snprintf更安全但写法冗长 -
itoa不是标准函数,Windows 有,Linux GCC 通常不提供,跨平台不可靠 -
std::stringstream功能强但开销大,构造 + 插入 + 提取三步操作,性能不如to_string
除非你需要格式化(如补零、科学计数法),否则 std::to_string 是更轻量、可读性更高、且标准保证的行为。
常见错误:隐式转换失败与命名空间问题
编译报错 ‘to_string’ was not declared in this scope 是最常遇到的问题,原因通常是:
- 未包含头文件:
#include(不是或) - 未指定命名空间:必须写
std::to_string,不能依赖using namespace std;(尤其在头文件中) - C++ 标准版本低于 11:检查编译器是否启用 C++11 或更高(如 g++ 加
-std=c++11)
注意:某些嵌入式 STL 实现(如部分裸机 libc++ 变体)可能未实现 to_string,此时需回退到 std::ostringstream。
需要格式化时的替代方案
如果要转成十六进制、固定宽度或带前导零,std::to_string 无能为力,应改用:
- 十六进制:用
std::ostringstream配合std::hex - 补零(如 4 位):
std::ostringstream+std::setw(4)+std::setfill('0') - 高性能批量转换(如日志拼接):考虑
fmt::format(C++20 前的工业级选择)或absl::StrCat
例如补零:
int n = 7;
std::ostringstream oss;
oss << std::setw(3) << std::setfill('0') << n;
std::string s = oss.str(); // "007"
真正要注意的是:别在循环里反复创建 std::ostringstream 对象——它的构造/析构成本比 to_string 高得多;而 to_string 的“简单”恰恰是它被设计出来的核心价值。











