std::to_string是C++11起定义在中的标准函数,支持基本数值类型转字符串,不抛异常、线程安全,但无格式控制、不支持指针或自定义类型。

to_string 是 C++11 起的标准函数,直接可用
只要编译器支持 C++11 或更高(g++ -std=c++11、MSVC 2013+、Clang 3.1+),std::to_string 就是开箱即用的,不需要额外链接或头文件——它定义在 中。
常见错误是忘了 #include ,或者误以为要 using namespace std; 才能用(其实加 std:: 前缀更安全)。
-
std::to_string(42)→"42" -
std::to_string(-7)→"-7" -
std::to_string(0)→"0"
to_string 只支持基本整型和浮点型,不支持 char* 或自定义类型
它接受的参数类型很有限:int、long、long long、unsigned 系列、float、double、long double。传 char 会转成 ASCII 数字(比如 std::to_string('a') 得到 "97"),不是你想要的字符本身。
- 想转
const char*?直接构造std::string s = "hello"; - 想转
std::vector?得自己循环拼接,to_string不处理容器 - 传
nullptr或未初始化变量?行为未定义,别这么干
to_string 没有格式控制,小数精度不可调
对浮点数,std::to_string(3.14159) 固定输出约 6 位有效数字(实际是按默认精度 + 尾随零截断),得不到 "3.14" 或科学计数法。这不是 bug,是设计使然——它只做“最简直译”,不负责格式化。
立即学习“C++免费学习笔记(深入)”;
- 需要保留两位小数?用
std::ostringstream或std::format(C++20) - 需要前导零或千分位?
to_string完全不支持 - 性能敏感场景?它比
sprintf稍慢,但足够日常使用;极端情况才需考虑itoa(非标准)或std::to_chars(C++17,无内存分配)
注意负数和边界值的转换结果
to_string 对 INT_MIN 这类极值能正确处理(比如 std::to_string(INT_MIN) 得到 "-2147483648"),但前提是传入的是对应类型的字面量或变量。如果发生隐式类型截断(比如把 long long 强转成 int 再传),结果就取决于截断后的值。
- 别写
std::to_string((int)some_long_long_value),除非你明确知道不会溢出 - 传
unsigned int时不会带+号,std::to_string(0u)就是"0",不是"+0" - 多线程下安全:
to_string是纯函数,无全局状态,可并发调用
真正容易被忽略的是:它不抛异常,也不返回错误码——输入合法类型就一定有字符串输出,哪怕数值极大(如 LLONG_MAX)也照转不误。这意味着你不能靠捕获异常来判断转换失败,得在调用前确保类型和值域合理。










